メインコンテンツ

MISRA C++:2008 Rule 8-5-1

All variables shall have a defined value before they are used

説明

ルール定義

All variables shall have a defined value before they are used 1

根拠

C++ 規格では、未初期化メモリの値についての指定がありません。この値は予測不能であり、プログラムを実行するたびに異なる値になる可能性があります。未初期化メモリの値の読み取りと使用は、予期しない動作の原因になる可能性があります。

Polyspace 実装

Polyspace ® は、コードに以下の問題が含まれている場合にこの違反を報告します。

Polyspace は、クラスのコンストラクターがクラスの非静的メンバーを初期化するかどうかをチェックしません。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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

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

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

    return val; //Noncompliant              
   
}

この例では、flag が 0 でない場合、メンバー _c は初期化されません。

欠陥は、コンストラクターの右 (閉じ) 中かっこに表示されます。ソース コード内での移動のヒントを以下に示します。

  • [結果の詳細] ペインで、初期化されていないメンバーを確認します。

  • クラス定義に移動するには、コンストラクター内で初期化されているメンバーを右クリックします。[定義に移動] を選択します。クラス定義では、コンストラクター内で初期化されていないメンバーを含め、すべてのメンバーを確認できます。

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
    }
}//Noncompliant

prevNULL でない場合、ポインター pi にはアドレスが割り当てられません。しかし、prevNULL かどうかにかかわりなく、pi はすべての実行パスでデリファレンスされます。

#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
      {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
      }

    *pi = j; //Noncompliant                    

    return pi;
}

チェック情報

グループ: Declarators
カテゴリ: 必要

バージョン履歴

R2013b で導入

すべて展開する


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.