メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 11.6.2

The value of an object must not be read before it has been set

R2024b 以降

説明

ルール定義

The value of an object must not be read before it has been set. 1

根拠

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

チェック情報

グループ: Declarators
カテゴリ: Mandatory

バージョン履歴

R2024b で導入


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.