MSC12-C. プログラムに対して作用しないコードを検出して削除する
実行しても作用しないコードや、意図せぬ影響を及ぼすコードは、コーディングエラーが原因で作り込まれることが多く、予期せぬプログラムの動作を引き起こすことがある。プログラムに対して作用しない文や式を特定し、コードから削除すること。最新のコンパイラの多くは、作用しないコードを警告してくれる(「MSC00-C. 厳しい警告レベルで警告を出さずにコンパイルする」を参照)。
このレコメンデーションは「MSC07-C. デッドコードを検出して削除する」に関連している。
違反コード (代入)
以下のコードにおいて、a
と b
の比較はプログラムに対して作用しない。
int a; int b; /* ... */ a == b;
これはおそらく、プログラマが代入演算子 =
の代わりに間違って等価演算子 ==
を使用したケースであると考えられる。
適合コード (代入)
今度は、a
への b
の代入が適切に実行される。
int a; int b; /* ... */ a = b;
違反コード (ポインタ参照)
以下のコードではポインタはインクリメントされてから参照されている。しかし参照はプログラムに対して作用しない。
int *p; /* ... */ *p++;
適合コード (ポインタ参照)
どのように修正するかは、プログラマの意図により異なる。たとえば、p
を参照するのが間違いの場合は、p
への参照は行うべきではない。
int *p; /* ... */ p++;
p
が参照する値をインクリメントすることを意図していたならば、括弧を使用して p
の参照後にインクリメントされるようにする(「EXP00-C. 括弧を使用して演算の優先順位を指定する」を参照)。
int *p; /* ... */ (*p)++;
適合コード (メモリマップデバイス)
別の可能性は、p
を使用してメモリマップデバイスを参照する場合である。この場合、変数 p
を volatile
宣言する必要がある。
volatile int *p; /* ... */ (void) *p++;
リスク評価
プログラムに対して作用しないコードの存在は、予期せぬ動作や脆弱性につながるエラーを示唆している可能性がある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
MSC12-C |
低 |
低 |
中 |
P2 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Coverity |
6.5 |
NO_EFFECT |
何も成さない文または式、もしくは意図しないアクションを実行する文を検出する。 |
ECLAIR |
1.1 |
noeffect |
部分的に実装済み |
GCC |
3.0 |
このオプションは、未使用のローカル変数または非定常な静的変数と、未使用の関数の引数をそれぞれ検出する。 |
|
V. 9.1 |
EFFECT |
|
|
LDRA tool suite |
V. 8.5.4 |
65 D |
実装済み |
PRQA QA-C | 8.1 |
3110 |
部分的に実装済み |
Splint |
V. 3.1.1 |
|
|
関連するガイドライン
CERT C++ Secure Coding Standard | MSC12-CPP. Detect and remove code that has no effect |
ISO/IEC TR 24772 | Leveraging Human Experience [BRS] Unspecified Functionality [BVQ] Likely Incorrect Expressions [KOA] Dead and Deactivated Code [XYQ] |
MISRA-C | Rule 14.1 Rule 14.2 |
参考資料
[Coverity 2007] |
翻訳元
これは以下のページを翻訳したものです。
MSC12-C. Detect and remove code that has no effect (revision 77)