メインコンテンツ

AUTOSAR C++14 Rule A8-5-0

All memory shall be initialized before it is read

説明

ルール定義

すべてのメモリは読み取る前に初期化するものとします。

根拠

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

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;
}

チェック情報

グループ: 宣言子
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入

すべて展開する