2013-10-15 18 views
5

gcc(4.4.6)に-O2 -Wallフラグを追加した後の警告コードを消去します。 私はいくつかのレガシーコードで多くの警告を受けています。これは、問題を実証するための非常に単純化したバージョンです:gcc - removal "はこの関数で初期化されていません"警告

1 #include <cstdio> 
    2 
    3 bool init(bool& a) 
    4 { 
    5  return true; 
    6 } 
    7 
    8 int main() 
    9 { 
10  bool a; 
11 
12  if (!init(a)) 
13  { 
14   return 1; 
15  } 
16 
17  if (a) 
18  { 
19   printf("ok\n"); 
20  } 
21 } 

私が受け取る "gccのmain.cppに-O2 -Wall" としてそれをコンパイルする場合:実際のコードで

main.cpp:17: warning: `a' is used uninitialized in this function 

をと、init()がtrueを返します"a"を初期化する場合に限り、初期化されていない "a"によって仮想的に使用されることはありません。

警告を修正するためにWhanを実行できます。

+0

に-Wno-初期化されていない追加しますか? UBプログラムがなぜ機能しないのかを理解したいときは、後でSOに戻ってきますか? – DanielKO

答えて

9

変更bool a;bool a = false;はこの警告を削除します。

init(a)は、 'aを初期化する'ことを意味していますが、プログラムは初期化されていない変数を持つ関数を呼び出そうとしています。

+2

しかし、 'init()'は引数に何も書き込まないので、コンパイラは正しいので、初期化は行われません。 – DanielKO

7
int main() 
{ 
    bool a = false; 
    ... 

常にすべての変数を初期化してください。

+5

私は同意しません。 *初期化する必要がないものを初期化すると、バグが隠されることがあります。これは長い暴言かもしれませんが、ここではローカル変数の特別な場合の例を残しておきます:1つのブランチに設定されるか、または下のいくつかの 'if'構造のもう1つを設定すると仮定します。それをdeclで非初期化したままにします。すべてのブランチで設定しなかった場合は、警告が表示されます。 0に初期化する(一般的な考え方ではない)、警告が表示されなくなるので、コンパイラは(警告がないために)常に設定されていることを知る手助けをしなくなります。おそらく、第2のプッシュはポップであると考えられています。 – greggo

7

あなたには、いくつかの値を持つ変数を初期化したくない場合は、GCCのdiagnostic pragmasを使用することができます。

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wuninitialized" 
    if(a) 
#pragma GCC diagnostic pop 

すべてが初期化されるだろうというとき、あなたのコードは性能も問題がある場合、これは便利かもしれません。あなたの例ではもちろん、bool a = false;を使用する方が明らかに良い選択です。

+0

最初のプッシュは不要だと私は信じている。 – jxh

+0

@jxhありがとう、ポップの答えを修正しました。プッシュなしのポップは単にコマンドラインからオプションを復元するため、プッシュOTOHが必要です。もし誰かが(もっと大きな文脈のために)上記の周りに別のプッシュ/ポップをネストしたいなら、私は他の開発者がプッシュして混乱を作り出すものをぽんと鳴らします。したがって、常に一致するローカルプッシュ/ポップペアを常に持つことがベストプラクティスです。 –

+0

コンパイル時に適切に実装されていれば、初期化されていない値が有用な場合があります:m64のベクトルをm128に変換するために_mm_set_epi64(dontcare、x)を使用します.dontcareはunintializedであり、は、その値が_mm_unpacklo_ downstreamで使用されているためです。私が 'dontcare'に特定の価値を置くと、それを生成するための余分なコードが含まれている可能性があります。コンパイラは、この値が演算子から気にしないことを知っており、そのコードを削除することはできません(可能です)。しかし、私が気にしないでいれば、オプティマイザによってすべてが落とされる可能性があります。:-( – greggo

3

あなたは未定義の動作を生成するコードをコンパイルしたい、まだあなたは `-Wall`を使用しているあなたのコンパイルオプション

+1

-1。コンパイルを無効にするこの場合、コードに実際の問題があることを示す警告(この場合、未定義の動作によって引き起こされる)は、間違いなく良い練習ではありません。 –

+1

これはどのようにその警告を抑制するかに関する答えです。いい練習。 – tristan

関連する問題