2009-05-20 12 views
2

gccでは、特定の警告で最適化を有効にする必要があります。例:gccで警告の分析を有効にするためのスイッチ

int foo() { 
    int x; 
    return x; 
} 

初期化されていない変数を検出するには、-Oを渡す必要があります。

$ gcc -W -Wall -c test.c 
$ gcc -W -Wall -c test.c -O 
test.c: In function ‘foo’: 
test.c:3: warning: ‘x’ is used uninitialized in this function 

しかし、これはデバッグを妨げる可能性があります。生成されたコードに多大な影響を与えることなく、警告に必要な分析フェーズ(この特定の警告だけでなく、可能な限り多く)を有効にする方法はありますか?

私はx86-64でgccバージョン4.3.3(Ubuntu 4.3.3-5ubuntu4)を使用しています。

+3

愚かな答えは、警告の場合は-Oで、デバッグの場合はそれなしでコンパイルすることです。私は本当に良い方法があることを本当に願っています。 – Zifre

+0

gccが-Oなしで警告を発行しない理由は、-Oなしのデータフロー分析を行わないということです。だからあなたはDFAをするように求めていますが、警告を出すためにそれらを使う以外の結果を破棄します。これは-Oでコンパイルするのと同じくらい時間がかかりますが、Zifreの提案と同じくらい長くはなりません。しかし、私はgccにそれをさせる方法は知らないし、manページはそれが不可能であることを示唆している。 –

+0

-Oは十分に速いです、私はちょうどそれがデバッグをうんざりしないことを望んでいます。 gdbを破らず、警告分析を実行する特定の最適化フェーズを有効にする方法についての提案も歓迎します。 – bdonlan

答えて

2

-Wの代わりに-Wallを試してみてください。 -Wは非推奨です。 (ジョナサン・レフラーコメントで指摘したように、-Wの置換は-Wextra、ない-Wallある。)

[編集]

-Wunused-variable
ローカル変数または非定数静的変数が使用されていないときはいつでも警告その宣言を除いて。この警告は-Wallによって有効になっています。

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html#Warning-Options

[編集]

この動作はchanged in GCC 4.4あります

初期化されていない警告はもう最適化を可能必要としない、つまり、-Wuninitialized-O0と一緒に使用することができます。それにもかかわらず、-Wuninitializedで示される警告は、おそらく最適化が有効な場合にはより正確になります。

+0

上記の例のように、-W -Wallを渡すことで、最適化を無効にしてデータフロー解析を実行するには不十分です。 – bdonlan

+0

この問題はありません。私が-Wallを使うときはいつでも、私は警告を受け取ります(しかし、-Wではありません)。どのGCCバージョンを使用していますか? –

+0

質問に自分のgccバージョンを追加しました。 – bdonlan

0

DDDおよびgdbは、gcc -O -gでコンパイルされたコードにほとんど対処できます。あなたがそうであると予想するとき、変数が範囲にないこともありますが、DDDは狂っているのではなく「最適化された離れ」と言うほど賢いです。しかし、-Oでデバッグするのは簡単ではないことは疑いありません。—私はこれを学生のコードで多く見ました。

0

これは自動ビルドのためのものです。あなたの自動化されたビルドエンジンを-Werror -Wall -O2でビルドさせると、より高度な最適化レベルによって引き起こされたすべての警告を捕まえることができます。

+0

小さな趣味のプロジェクトのために、私は必ずしも自動ビルドエンジンを持っているとは限りません... – bdonlan

+0

どうしてですか?あなたは痛みを好む? –

+0

ハドソンのようなシステムはセットアップや構成が簡単です*小さなホビープロジェクトでも問題なく使用できます。 – JesperE

関連する問題