JPCERT コーディネーションセンター

MSC12-C. プログラムに対して作用しないコードを検出して削除する

MSC12-C. プログラムに対して作用しないコードを検出して削除する

実行しても作用しないコードや、意図せぬ影響を及ぼすコードは、コーディングエラーが原因で作り込まれることが多く、予期せぬプログラムの動作を引き起こすことがある。プログラムに対して作用しない文や式を特定し、コードから削除すること。最新のコンパイラの多くは、作用しないコードを警告してくれる(「MSC00-C. 厳しい警告レベルで警告を出さずにコンパイルする」を参照)。

このレコメンデーションは「MSC07-C. デッドコードを検出して削除する」に関連している。

違反コード (代入)

以下のコードにおいて、ab の比較はプログラムに対して作用しない。

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 を使用してメモリマップデバイスを参照する場合である。この場合、変数 pvolatile 宣言する必要がある。

volatile int *p;
/* ... */
(void) *p++;
リスク評価

プログラムに対して作用しないコードの存在は、予期せぬ動作や脆弱性につながるエラーを示唆している可能性がある。

レコメンデーション

深刻度

可能性

修正コスト

優先度

レベル

MSC12-C

P2

L3

自動検出(最新の情報はこちら

ツール

バージョン

チェッカー

説明

Coverity

6.5

NO_EFFECT

何も成さない文または式、もしくは意図しないアクションを実行する文を検出する。

ECLAIR

1.1

noeffect

部分的に実装済み

GCC

3.0

-Wunused-value
-Wunused-parameter

このオプションは、未使用のローカル変数または非定常な静的変数と、未使用の関数の引数をそれぞれ検出する。

Klocwork

V. 9.1

EFFECT

 

LDRA tool suite

V. 8.5.4

65 D
70 D
57 S

実装済み

PRQA QA-C 8.1

3110
3112

部分的に実装済み

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)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter