アカウント名:
パスワード:
movl $5, %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf
*n に入るべき値を %eax に代入しなおして、そっちを printf() に渡しているだけで。 実はその前の1行:
movl $5, (%eax)
が死ぬほどやばい。%eax は main() 関数に入ってきて以来、初期化されていない。その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる
main:.LFB13: .file 1 "afo.c" .loc 1 4 0 subq $8, %rsp.LCFI0: .loc 1 7 0 movl $5, %esi .loc 1 6 0 movl $5, (%rax).LVL0: .loc 1 7 0 movl $.LC0, %edi xorl %eax, %eax.LVL1: call printf .loc 1 9 0 xorl %eax, %eax addq $8, %rsp ret.LFE13:
(gdb) break 4Breakpoint 1 at 0x4004c0: file afo.c, line 4.(gdb) runStarting program: /home/okuyama/temp/a.out Breakpoint 1, main () at afo.c:44 {Missing separate debuginfos, use: debuginfo-install glibc.x86_64(gdb) info register rax riprax 0x33331539f0 219900361200rip 0x4004c0 0x4004c0 <main>(gdb) disassDump of assembler code for function main:0x00000000004004c0 <main+0>: sub $0x8,%rsp0x00000000004004c4 <main+4>: mov $0x5,%esi0x00000000004004c9 <main+9>: movl $0x5,(%rax)0x00000000004004cf <main+15>: mov $0x4005e8,%edi0x00000000004004d4 <main+20>: xor %eax,%eax0x00000000004004d6 <main+22>: callq 0x4003b8 <printf@plt>0x00000000004004db <main+27>: xor %eax,%eax0x00000000004004dd <main+29>: add $0x8,%rsp0x00000000004004e1 <main+33>: retqEnd of assembler dump.(gdb) x/4x 0x33331539f00x33331539f0 <environ>: 0x611d6868 0x00007fff 0x00000000 0x00000000(gdb) stepi 37 printf("%d\n", *n);(gdb) info register rax riprax 0x33331539f0 219900361200rip 0x4004cf 0x4004cf <main+15>(gdb) x/4x 0x33331539f00x33331539f0 <environ>: 0x00000005 0x00007fff 0x00000000 0x00000000
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あつくて寝られない時はhackしろ! 386BSD(98)はそうやってつくられましたよ? -- あるハッカー
オプティマイザの魔法? (スコア:1)
もしかして無意識にオプティマイザに助けられていて意識するのを忘れていたとか?
-- やさいはけんこうにいちば〜ん!
Re: (スコア:3, 参考になる)
*n に入るべき値を %eax に代入しなおして、そっちを printf() に渡しているだけで。
実はその前の1行:
が死ぬほどやばい。
%eax は main() 関数に入ってきて以来、初期化されていない。
その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる
fjの教祖様
Re: (スコア:0)
Re:オプティマイザの魔法? (スコア:1)
Fedora8 x86_64
という環境に移って実行したところ、
というコードになりました。で、%rax が指しているのは environ です。
どうやら環境変数の開始アドレスを示しているポインタの末尾4 byte を 0x00000005 に変更しているようです。
# 32bit だと、environ アドレスそのものを 0x00000005 に変更していることになるかと予測される。 というわけで、この代入実行後、32bit 環境で、環境変数を参照したら一撃で絶命ですね。
コンパイラが助けてくれたわけではないようです。単に破綻に気がつく前に終了しているだけ。
fjの教祖様