(gdb) b 6
Breakpoint 1 at 0x1c0005e1: file test.c, line 6.
(gdb) r
Starting program: /home/fooooooooo/a.out
Breakpoint 1, main () at test.c:6
(gdb) p n
$1 = (int *) 0x1c000620
(gdb) x/2i 0x1c000620
0x1c000620 <__fini>: call 0x1c0005b0
0x1c000625 <__fini+5>: ret
(gdb)
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
main () at test.c:6
(gdb) b 6
Breakpoint 1 at 0x1c0005e8: file test.c, line 6.
(gdb) r barrrr
Starting program: /home/fooooooooo/a.out barrrr
Breakpoint 1, main () at test.c:6
(gdb) p n
$1 = (int *) 0xcfbe87e8
(gdb) x/2s 0xcfbe87e8
0xcfbe87e8: "/home/fooooooooo/a.out"
0xcfbe87ff: "barrrr"
(gdb) c
Continuing.
5
オプティマイザの魔法? (スコア:1)
もしかして無意識にオプティマイザに助けられていて意識するのを忘れていたとか?
-- やさいはけんこうにいちば〜ん!
Re:オプティマイザの魔法? (スコア:3, 参考になる)
実はその前の1行: が死ぬほどやばい。
%eax は main() 関数に入ってきて以来、初期化されていない。
その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる。
これがヒープを壊しているのか、スタックを壊しているのかは判らないが(なんかヒープのどっかを指しているっぽい)、とにかく、どこかを壊しているのは間違いない。今回は小さなプログラムだったので、破綻が表出する前に終了しているのに過ぎない。
fjの教祖様
Re: (スコア:0)
Re:オプティマイザの魔法? (スコア:1, 興味深い)
何処のアドレスを入れているのか興味を持ったので調べてみました。
ちなみに環境は,openbsd+gcc version 3.3.5 (propolice)です。
gcc -g -O test.cでコンパイルした場合。
nは初期化されず,textセグメント内の__finiを指し示していたので,当然Segmentation fault.で落ちました。
gcc -g test.cでコンパイルした場合。
nはargcらしき領域のアドレスで初期化されていました。argcの内容が上書きされるだけなので,とりあえず動作はする。
でも,なんでこんな初期化をしているのかと言う,疑問は残ります??
Re: (スコア:0)
バーカ -8(%ebp) が n だっつーの。
Re: (スコア:0)
両方とも,レジスタに割り付けられているものと,勘違いしてました。
出直してきます.... orz.
Re:オプティマイザの魔法? (スコア:1)
Fedora8 x86_64
という環境に移って実行したところ、
というコードになりました。で、%rax が指しているのは environ です。
どうやら環境変数の開始アドレスを示しているポインタの末尾4 byte を 0x00000005 に変更しているようです。
# 32bit だと、environ アドレスそのものを 0x00000005 に変更していることになるかと予測される。 というわけで、この代入実行後、32bit 環境で、環境変数を参照したら一撃で絶命ですね。
コンパイラが助けてくれたわけではないようです。単に破綻に気がつく前に終了しているだけ。
fjの教祖様
Re: (スコア:0)
しかし、多くの人はそんな過保護な環境ではないのだけどね。
Re: (スコア:0)
int* p1;
int* p2;
*p1=1;
*p2=2;
printf("%d",*p1); /* 先生!! メモリが破壊されました!! */
#if 0
まさか全てのポインタは自動的に異なるアドレスで初期化されて、
そのアドレスは絶対他の変数にアロケートされない環境ですか!?
なんて過保護な(w
#end if
Re:オプティマイザの魔法? (スコア:1)
Best regards, でぃーすけ
Re: (スコア:0)
スタックフレーム上に変数こさえるかレジスタに割り当てるかの違いだろ。
-O2 でも eax の値の番地壊してるよ。