- ベストアンサー
gccの最適化オプションで挙動がおかしくなる
コンパイラの最適化オプション -Osをつけると、下記のソースの終了コードが255になってしまいます。 最適化を行わない時や最適化を-O1にしたときは、0を返します。 本来は0が返ると思うのですが、なにかコードの書き方に何か問題ありますでしょうか? 環境は、 gcc 4.2、Mac Xcode 3.1.4上でテストしています。 また、ソースの文字コードの種類はSJISにしています。 const unsigned char gStr[3]="\x82\xAC"; int main(int ac, char **av) { const unsigned char cc=0x82; if(gStr[0]==cc) return 0; else return 0xff; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
print("%d %d\n",gStr[0],cc); とテストコードを入れてみたところ gcc-4.0.1(Xcode), gcc-4.3.4(MacPorts)、gcc-4.2.1(Xcode/最適化なし,-O1)では 130 130 となりますが gcc-4.2.1(-O2,-O3,-Os等)で -126 130 となり、unsignedになっていないようです。 おそらく、gccのバグでしょう。
その他の回答 (2)
- kuku-suke
- ベストアンサー率25% (2/8)
Macは持っていないのですが、gcc4.3では確認した分では-Osでも違いはでませんね。 -S をつけてサイズ最適化をしたときとしないときのアセンブラソースを出力し、どのような違いがでているか見てみてはいかがでしょうか?
補足
回答ありがとうございます。 -Os と-O1 のアセンブラをみてみましたが、見事に何もしていませんでしたが、確実に違う結果を出すコードになってます。 gcc 4.2(正確には、4.2.1) と では挙動が異なるのでしょうかね。 -- -Os option --- _main: pushl %ebp movl %esp, %ebp movl $255, %eax leave ret .globl _gStr .cstring _gStr: .ascii "\202\254\0" -- -O1 option -- _main: pushl %ebp movl %esp, %ebp movl $0, %eax leave ret .globl _gStr .cstring _gStr: .ascii "\202\254\0"
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
gccの最適化にはバグがあります。 しかし、例示されたような「無意味なコード」についての最適化バグは修正がリリースされていません。 リリースが無い理由は「無意味なコードが正しく動くように修正を施しても、無意味だから」です。 gccの基本スタンスは「実行せずとも結果が明らかなコードは書くな。そんなの書いてもちゃんとコンパイルする保証はしない」です。
補足
回答ありがとうございます。 たしかに、ここで示したのは意味のないコードですが、 「結果が明らかでない」コードの挙動がおかしかったので、 原因を調べるために、なるべくプリミティブなコードにして調べています。 しかし、「実行せずとも結果が明らかなコードは書くな」そんなスタンスがあるとは知りませんでした。
お礼
数々の調査結果を、ありがとうございます。 このバージョンのgcc特有の現象みたいですね。