プロが教える店舗&オフィスのセキュリティ対策術

コンパイラの最適化オプション -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;
}

A 回答 (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のバグでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/08 18:56

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"

補足日時:2010/02/08 16:14
    • good
    • 0

gccの最適化にはバグがあります。



しかし、例示されたような「無意味なコード」についての最適化バグは修正がリリースされていません。

リリースが無い理由は「無意味なコードが正しく動くように修正を施しても、無意味だから」です。

gccの基本スタンスは「実行せずとも結果が明らかなコードは書くな。そんなの書いてもちゃんとコンパイルする保証はしない」です。

この回答への補足

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

補足日時:2010/02/08 16:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!