最近ツイッターで
“while(1){LOVE++}”と書き込まれてる指輪があって、
そのソースは最適化でLOVEが消えてただの無限ループになる云々という話があったので検証。
用意したソースはこちら。
int main()
{
int LOVE = 0;
while(1){LOVE++;}
}
それじゃアセンブラを見てみましょ。
まずは最適化抜き。
gcc -O0 -s hoge.c
.file “hoge.c”
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp) ;LOVE=0
.L2:
addl $1, -4(%ebp) ;LOVE++
jmp .L2 ;JUMP TO L2
.size main, .-main
.ident “GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5”
.section .note.GNU-stack,”“,@progbits
LOVEは残ってますね。
gcc -O1 -s hoge.c
.file “hoge.c”
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
.L2:
jmp .L2 ;JUMP TO L2
.size main, .-main
.ident “GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5”
.section .note.GNU-stack,”“,@progbits
愛は最適化によって消滅しました。