2

このプログラム

int main()
{
    int a, b;
    a = b;
    return 0;
}

でコンパイルすると、警告やエラーなしでコンパイルされます

g++ -Wall test.cpp

ただし、同じ警告レベルであっても、最適化をオンにしてコンパイルすると

g++ -Wall -Os test.cpp

次に、初期化されていない変数を使用していると文句を言い始めます。
(注:実際のプログラムは少し長く、この小さな例ほど明確に問題を明らかにしていません。)

グーグルで検索しようとしましたが、正しい検索用語を使用していないか、これは既知の現象ではありません。とにかく、私の質問は基本的に

  • 同じ警告レベルであっても、コンパイラがこの警告を-Osで表示し、-O0では表示しないのはなぜですか?(どちらかといえば、変数を完全に最適化することができ、問題がなくなるので、この小さな例では逆になると思います。)
  • このような予期しない警告をトリガーする他のコンパイラオプションはありますか?私は自分のプログラムをバグフリーにすることに興味があるので、それらすべてを見るのが好きです!
  • これは既知の機能ですか?もしそうなら、どこでそれを見つけることができますか?検索してみました。
  • それとも、これは私の特定のバージョンのコンパイラ(gcc 4.3.2-1.1、Linux、32ビット)の単なる不具合ですか?
4

2 に答える 2

3

コンパイラーは、いくつかの最適化を実行するために追加のチェックを行う必要があります。これにより、コンパイラーは追加の警告を発行します。GCCの概要の関連する章に簡単な説明があります。

ちなみに、私のプラットフォーム(x86では32ビットubuntu 12.04)では、コードはgcc 4.6.3、gcc 4.7.0、およびgcc4.8スナップショットで警告を生成します。

uninitialized.cpp:関数内'int main()':uninitialized.cpp:3:9:警告:変数'a'設定されていますが使用されていません[-Wunused-but-set-variable]uninitialized.cpp:4:10:警告:'b'はこの関数で初期化されていない状態で使用されます[-Wuninitialized]

于 2012-05-20T07:37:32.497 に答える
1

より高い最適化レベルでは、コンパイラーは、初期化されていない変数を同等にしていることに気づきます。そして、警告。

于 2012-05-20T07:15:28.943 に答える