MSC00-C. 高い警告レベルでのコンパイルで警告が出ないようにする
最も高い警告レベルでコードをコンパイルし、コードを修正して警告が出ないようにせよ。
C 標準 [ISO/IEC 9899:2011] 5.1.1.3 項には次のように規定されている。
前処理翻訳単位又は翻訳単位が何らかの構文規則違反又は制約違反を含む場合(たとえ、その動作が未定義の動作又は処理系定義の動作として明示的に規定されていても)、規格合致処理系は、その前処理翻訳単位又は翻訳単位に対して、少なくとも一つの(処理系定義の方法で識別される)診断メッセージを出力しなければならない。その他の状況においては、診断メッセージを出力しなくてもよい。
規格合致処理系であれば、診断メッセージを解消することで構文違反や制約違反を解消することができる。
目的に合ったソースコード解析ツールを利用できるようであれば、定期的にこれを使用するのがよい。
C 標準規格が認めるとおり、コンパイラは正しいコードに対して診断メッセージを出力することがありうる。通常は、コードを修正してコンパイラの警告を解消することが望ましいが、コードが正しい場合、コンパイラの警告に当たらない理由をコメントに付すことで十分であろう。コンパイラによっては、警告を抑止する手段として、専用フォーマットのコメントやプラグマを提供するものもある。プログラマは、警告の意味を理解した上で、それでも警告を出すコードを使用しなくてはならない正当な理由がある場合にのみ、警告を抑止する手段を控えめに使用すべきであろう。
型キャストの追加や他の方法で安易に警告を抑止してはならない。そうではなく、警告が出る理由を理解し、たとえば、型を一致させて型キャストをできるだけ避けるなど、警告を出さないためのより良い解決策を検討することである。
違反コード (Windows)
#pragma default
のように default
警告指定子を使うと、警告の動作が既定値にリセットされる。リセット後の動作は、リセット前の動作とは異なるかもしれない。警告メッセージを一時的に無効にした後で過去の警告メッセージを復活させるために、誤ってdefault
警告指定子を使うことがよくある。
#pragma warning(disable:4705) #pragma warning(disable:4706) #pragma warning(disable:4707) /* 警告が不必要なコード */ #pragma warning(default:4705) #pragma warning(default:4706) #pragma warning(default:4707)
適合コード (Windows)
default
警告指定子を使うのではなく、現在の警告の状態は保存し、警告が不要なコードの後で復活させるべきである。
#pragma warning(push) #pragma warning(disable:4705) #pragma warning(disable:4706) #pragma warning(disable:4707) /* Unnecessarily flagged code */ #pragma warning(pop)
pragma warning(push)
はすべての警告について、現在の警告の状態を保存する。pragma warning(pop) はスタックにプッシュされた最後の警告状態をポップする。プッシュとポップの間の警告状態に行った変更は無効になる。
リスク評価
構文規則違反や他の制約違反を解消することで、脆弱なプロセスの権限における任意のコード実行につながる深刻なソフトウェアの脆弱性を排除できる可能性がある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
MSC00-C |
中 |
中 |
中 |
P8 |
L2 |
自動検出(最新の情報はこちら)
ツール | バージョン | チェッカー | 説明 |
---|---|---|---|
CodeSonar | 4.0 |
BUILD.WALL BUILD.WERROR |
全ての警告が有効にされているわけではない 警告はエラーとして取り扱われない |
SonarQube Plugin | 3.0 | S1762 | #pragma で default 警告指定子が使用されている場合に警告する |
関連するガイドライン
CERT C++ Secure Coding Standard | MSC00-CPP. Compile cleanly at high warning levels |
MITRE CWE | CWE-563, Unused variable CWE-570, Expression is always false CWE-571, Expression is always true |
参考資料
[ISO/IEC 9899:2011] | Section 5.1.1.3, "Diagnostics" |
[Seacord 2013] | Chapter 9, "Recommended Practices" |
[Sutter 2005] | Item 1 |
翻訳元
これは以下のページを翻訳したものです。
MSC00-C. Compile cleanly at high warning levels (revision 61)