• ベストアンサー

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; }

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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のバグでしょう。

nbh9
質問者

お礼

数々の調査結果を、ありがとうございます。 このバージョンのgcc特有の現象みたいですね。

その他の回答 (2)

回答No.2

Macは持っていないのですが、gcc4.3では確認した分では-Osでも違いはでませんね。 -S をつけてサイズ最適化をしたときとしないときのアセンブラソースを出力し、どのような違いがでているか見てみてはいかがでしょうか?

nbh9
質問者

補足

回答ありがとうございます。 -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"

回答No.1

gccの最適化にはバグがあります。 しかし、例示されたような「無意味なコード」についての最適化バグは修正がリリースされていません。 リリースが無い理由は「無意味なコードが正しく動くように修正を施しても、無意味だから」です。 gccの基本スタンスは「実行せずとも結果が明らかなコードは書くな。そんなの書いてもちゃんとコンパイルする保証はしない」です。

nbh9
質問者

補足

回答ありがとうございます。 たしかに、ここで示したのは意味のないコードですが、 「結果が明らかでない」コードの挙動がおかしかったので、 原因を調べるために、なるべくプリミティブなコードにして調べています。 しかし、「実行せずとも結果が明らかなコードは書くな」そんなスタンスがあるとは知りませんでした。

関連するQ&A

専門家に質問してみよう