メインコンテンツ

デッド コード

コードが実行されない

説明

この欠陥は、常に true または false になる条件が原因でコードのブロックに到達できない場合に発生します。この欠陥は以下を除外します。

  • Code deactivated by constant false condition: #if 0 または if(0) などのコンパイル時の定数を使用する命令をチェックする。

  • Unreachable code: gotobreakreturn などのコントロール エスケープ後のコードをチェックする。

  • Useless if: ステートメントが常に true であるかどうかをチェックする。

リスク

デッド コードは開発時間、メモリ、および実行サイクルを浪費します。開発者は実行されないコードを保守しなければなりません。実行されない命令でも保存およびキャッシュされる必要があります。

デッド コードは多くの場合、使用されることのないレガシ コードを表します。デッド コードを定期的にクリーン アップすると、将来の保守の負担が減ります。

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、同じ実行パスで 2 回チェックされるエラー状態が根本原因で、2 回目のチェックが冗長であるため、対応するブロックがデッド コードになっている可能性があります。

多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

以下の修正例を参照してください。

isinfisnan などの関数の使用でデッド コードが表示された場合、非有限値を考慮に入れる解析モードを有効にします。詳細は、非有限の浮動小数点を検討 (-allow-non-finite-floats) を参照してください

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#include <stdio.h>

int Return_From_Table(int ch){

    int table[5];

    /* Create a table */
    for(int i=0;i<=4;i++){
        table[i]=i^2+i+1;
    }

    if(table[ch]>100){ /* Defect: Condition always false */
         return 0;  
    }
    return table[ch];
}

配列 table 内の最大値は 4^2+4+1=21 であるため、テスト式 table[ch]>100 は常に false として評価されます。if ステートメント内の return 0 は実行されません。

修正 — デッド コードを削除

1 つの修正方法として、if 条件をコードから削除することができます。

#include <stdio.h>

int Return_From_Table(int ch){

    int table[5];

    /* Create a table */
    for(int i=0;i<=4;i++){
        table[i]=i^2+i+1;
    }

    return table[ch];
}
typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void do_something(suit s);

void bridge(void)
{
    suit card = nextcard();
    if ((card < SPADES) || (card > CLUBS))
        card = UNKNOWN_SUIT;

    if (card > 7) {
        do_something(card);
    }
}

suit 型は 5 つのオプションで列挙されます。ただし、条件式 card > 7card の最大値が 5 であるため常に false と評価されます。if ステートメント内の内容は実行されません。

修正 — 条件の変更

1 つの修正方法としてコードの if 条件を変更することができます。この修正では、7 は HEART に変更され、card 型に直接関連付けます。

typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void do_something(suit s);

void bridge(void)
{
    suit card = nextcard();
    if ((card < SPADES) || (card > CLUBS))
        card = UNKNOWN_SUIT;

    if (card > HEARTS) {
        do_something(card);
    }
}

結果情報

グループ: データ フロー
言語: C | C++
既定値: オン
コマンド ライン構文: DEAD_CODE
影響度: Low

バージョン履歴

R2013b で導入

すべて展開する