2016-05-25 8 views
1

gccがjが初期化されていないと不平を言っていないのはなぜですか? j + = 10を削除すると、実際には不平を言います... -Wallでコンパイルします(gcc 4.9と5.3でテスト済み)。GCCは初期化されていない変数について不平を言わない

int main(void) 
{ 
    int i; 
    int j; 
    int threshold = 100; 

    for (i = 0 ; i < 100 ; i++) 
    { 
     if (j >= threshold) 
      break; 
     j += 10; /* comment this line to enable uninitialized variable warning */ 
    } 
    return 0; 
} 
+1

初期化されていない、または使用されていないと訴えていますか?ところで、あなたの警告レベルは何ですか? – StoryTeller

+0

(-Wallと一緒に使用) 警告: 'j'はこの関数では初期化されていません。-Wmaybe-uninitialized] –

+1

このコードの警告を取得するには、 '-O1'を追加します(gcc 5.3)。最適化レベルを変更すると問題が発生しやすくなる可能性があります。 –

答えて

0

オプティマイザは、ループ全体が無意味であるが、それは少し複雑であることを把握することができますし、それは、あなたが高い警告レベルを使用していることを確認し、それが表示させない場合。 iとjの値はループの後で使用されず、jはループの中で使用されているため、ループの反復回数が問題。このような状況で、jを乱数に初期化すれば、まったく同じ結果になります。だからコンパイラは何も有害なことは起こりませんので、警告を出しません。

明らかに未定義の動作があるため、初期化されていない変数が原因でアプリケーション全体がクラッシュする可能性があります。しかし、それはコンパイラに任されています。そのようなことが起こった場合は、警告を受けるべきです。

1

この最適化レベルを高く設定すると、ループが最適化の目的で削除される可能性があります。

-O1または-O0でコンパイルしてみてください。

-Wall-pendantic

+2

あなたは正しいです、私はループを削除した最適化レベルをreleaizeしていません。 しかし、j + = 10 ... Strangeを削除するとループが削除されないのはなぜですか? –

+0

@ErikOomenは最適化について話すときに '-O3'を除いて何も問題がないことを示しています –

関連する問題