8

ACプログラムでscanfを使用して、STDINからintを読み取ります。

scanf("%d", &n);

最適化を有効にしてcプログラムをコンパイルすると、いくつかの警告が表示されます。

gcc main.c -lm -lpthread -O2 -o main
main.c: In function ‘main’:
main.c:45: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
main.c:50: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

しかし、最適化オプションを削除すると、なぜこれらの警告が表示されないのですか?

gcc main.c -lm -lpthread -o main

PS:私は-Wallなどを使用していません。

4

2 に答える 2

11

オプティマイザーの設定を変更すると、コンパイラーがコードを分析する量(および方法)が変更されます。

一部のプログラムフロー分析は、最適化が有効になっていない(または十分に高く設定されていない)場合に実行されないため、関連する警告は発行されません。
「未使用の変数」の警告は頻繁に見られます。これらの警告では、単にコンパイルするために必要なものを超えてコードを分析する必要があるため、通常は最適化を有効にした場合にのみコードを取得します。

(そして、あなたは本当にコンパイルする必要があります-Wall。)

于 2012-06-16T08:46:35.490 に答える
3

-Wunused-resultデフォルトで有効になっています: 警告をトリガーするには関数を積極的にデコレートする必要があるため、__attribute__ ((warn_unused_result))あまりにも自由に使用された場合にのみ誤検出が発生します。

追加のフラグを渡さなくても、gccは警告を生成するはずです。ただし、Mat が説明したように、コンパイラは最適化レベルを上げずに必要な制御フロー分析を行いません。

コードを修正するか、追加して警告を消してください-Wno-unused-result戻り値をキャストすることvoidもおそらく同様です。

コードで警告を黙らせるには、戻り値をダミー変数に割り当てる必要があります。これをキャストしvoidて、未使用の変数に関する新しい警告を回避できます。明示的に宣言された変数を C99 複合リテラルに置き換えることもできます (gcc 4.5.3 でテスト済み)。

voidこれは確かに最適ではありません - 私が最初に提案した-cast が機能することを本当に期待していました...

于 2012-06-16T09:17:31.097 に答える