

コンパイラの最適化オプション -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;
}
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のバグでしょう。

No.2
- 回答日時:
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"
No.1
- 回答日時:
gccの最適化にはバグがあります。
しかし、例示されたような「無意味なコード」についての最適化バグは修正がリリースされていません。
リリースが無い理由は「無意味なコードが正しく動くように修正を施しても、無意味だから」です。
gccの基本スタンスは「実行せずとも結果が明らかなコードは書くな。そんなの書いてもちゃんとコンパイルする保証はしない」です。
この回答への補足
回答ありがとうございます。
たしかに、ここで示したのは意味のないコードですが、
「結果が明らかでない」コードの挙動がおかしかったので、
原因を調べるために、なるべくプリミティブなコードにして調べています。
しかし、「実行せずとも結果が明らかなコードは書くな」そんなスタンスがあるとは知りませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python コードについて(初学者...
-
フィルターかけた後、重複を除...
-
VSコードでHTMLに(リンク)フ...
-
VSコードでバックスペースキー...
-
ペンダントライトのコードの色...
-
VBA 現在のセル番地を記憶、復...
-
Do~Loopを用いたマクロ
-
アルファベットに付いて質問し...
-
UWSCでMOUSEORG関数が上手く処...
-
変数名「cur」について
-
JavaScriptの定数名が取り消し...
-
pythonで同じコード内で複数の...
-
sinカーブの表示のさせ方
-
俗に言う「C言語」を学びたいと...
-
VB2005 RowFilterのパラメータ...
-
1日に1人がこなせるプログラム...
-
JANコードとPOSコードは同じ?
-
顧客データベースを作る場合、...
-
差し込み後、元データを変更し...
-
イェイイェイイェイ イェイイェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1日に1人がこなせるプログラム...
-
JavaScriptの定数名が取り消し...
-
access2021 VBA メソッドまたは...
-
JANコードとPOSコードは同じ?
-
PreviewKeyDownイベントが2回...
-
エクセルに見えない文字(JISX0...
-
オートフィルタで抽出結果に 罫...
-
Excelシート上で右クリックがで...
-
Exel VBA 別ブックから該当デ...
-
access2003 クエリSQL文に...
-
変数名「cur」について
-
Nullの使い方が不正です。
-
【VB6】実行ファイルとした後、...
-
VBAでファイルオープン後にコー...
-
COBOLの文法
-
Accessでの抽出で完全一致。
-
AccessでReplace関数を使うときに…
-
Access DCountでの連番について
-
sinカーブの表示のさせ方
おすすめ情報