メインコンテンツ

未初期化変数

使用前に初期化されていない変数

説明

この欠陥は、変数の値が読み取られる前にその変数が初期化されていなかった場合に発生します。

リスク

変数が明示的に初期化されていない場合、変数値は予測できません。変数が特定の値をもつことは期待できません。

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、値を変数に割り当てたがその割り当てに到達不能であるか、条件付きステートメントの 2 つの分岐のいずれかで値を変数に割り当てた可能性があります。到達不能コードまたは割り当ての欠落を修正します。

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

以下の修正例を参照してください。宣言時に変数を初期化することをお勧めします。

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

チェッカーの拡張

チェッカーは次の方法で拡張できます。

すべて展開する

int get_sensor_value(void)
{
    extern int getsensor(void);
    int command;
    int val;

    command = getsensor();
    if (command == 2) 
      {
        val = getsensor();
      }

    return val;              
    /* Defect: val does not have a value if command is not 2 */
}

command が 2 でない場合、変数 val には値が割り当てられません。この場合、関数 get_sensor_value の戻り値は未定です。

修正 — 宣言に際しての初期化

1 つの修正方法として、一部の実行パスで初期化が回避されることのないように、宣言時に val の初期化を行います。

int get_sensor_value(void)
{
    extern int getsensor(void);
    int command;
    /* Fix: Initialize val */
    int val=0;

    command = getsensor();
    if (command == 2) 
      {
        val = getsensor();
      }

    return val;              
 }

val には初期値 0 が割り当てられます。command が 2 と等しくない場合、関数 get_sensor_value はこの値を返します。

結果情報

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

バージョン履歴

R2013b で導入