web-dev-qa-db-ja.com

特定の変数で「初期化されていない状態で使用される可能性がある」GCCを無効にする

スタック変数で次の警告が表示されます。

warning: object.member may be used uninitialized in this function

この場合、CPUサイクルを消費するため、警告を取り除くためだけに初期化を強制したくありません。変数はPOD構造であるため、その上のmemsetはゼロコストではありません。変数が初期化されていない状態で使用されていないことを確認できるので、警告を抑制したいと思います。

一般に、この特定のシナリオのこの特定の変数ではなく、警告が必要です。警告を抑制するにはどうすればよいですか?


プラグマ診断が正しい方法のように見えますが、かなり新しいバージョンのGCC(4.6)が必要です。

そのバージョンより前の許容可能な解決策は知られていません。

30

これを試してください:

 #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

このプラグマには、warningerrorignoredの3つの興味深い便利なフレーバーがあります。使用法については、 6.56.10診断プラグマ を参照してください。リンクには、

GCCを使用すると、ユーザーは特定の種類の診断を選択的に有効または無効にしたり、診断の種類を変更したりできます。たとえば、プロジェクトのポリシーでは、すべての診断が必要になる場合があります。ソースは-Werrorでコンパイルされますが、特定のファイルには特定のタイプの警告を許可する例外がある場合があります。または、プロジェクトで診断を選択的に有効にし、定義されているプリプロセッサマクロに応じてエラーとして扱う場合があります。

33
Nawaz

@Nawazは具体的に尋ねられた質問に回答しましたが、これが必要であるという事実は、structを宣言するのが早すぎる/適切よりもネストされていないスコープである可能性があると考えましたか? structを以前に宣言してさまざまな場所に入力するのではなく、実際に初期化できるポイントで宣言できると、一般的に非常に望ましいでしょう。

また、現在初期化されていない状態で使用されていないことを確認できたとしても、将来誰かが新しいコードパスを追加し、正しく初期化されなかった場合はどうなりますか?警告を無効にすると、サイレントにコンパイルされ、予期しない方法で破損する可能性があります。初期化がプログラムのCPUの測定可能な量を使用していることを証明できない限り、初期化を前もって行う方がおそらく良いでしょう。

5
Mark B

GCCは、初期化されていないものと自己初期化されたものを区別します。コンパイル:

int main() {
   int i = i;
   return i;
}

gcc -Wall -Wextraを明示的に追加しない限り、-Winit-selfを使用しても警告は表示されませんが、私のクイックテストでは完全に最適化されています。

4
Flexo
0
frankc