メインコンテンツ

AUTOSAR C++14 Rule A5-0-1

The value of an expression shall be the same under any order of evaluation that the standard permits

説明

ルール定義

The value of an expression shall be the same under any order of evaluation that the standard permits.

根拠

評価の順序に応じて式の結果が異なる値になる場合、その値は処理系定義になります。

Polyspace 実装

Polyspace® は、式が以下の条件を 1 つでも満たす場合、違反を報告します。

  • 同じ変数が式内で複数回変更される、あるいは同じ変数に対して読み取りと書き込みの両方が実行される。

  • 式で、異なる結果につながる可能性がある複数の評価順序が許可されている。

  • 式内で単一の volatile オブジェクトが複数回出現する。

  • 式に複数の volatile オブジェクトが含まれる。

volatile オブジェクトは随時、その値を変更可能であるため、複数の volatile 変数または同じ volatile 変数の複数のインスタンスが含まれる式は、評価順序によって結果が異なる可能性があります。

Polyspace は関数呼び出しが含まれる式をチェックする際に、関数の本体をチェックします。関数の本体に他の関数の呼び出しが含まれていなければ、それらの関数の本体はチェックされません。次に例を示します。

int f1(){return 1;}
int f2(){return g();}
int g(){return 2;}

void foo(void){
	int z = f1()+f2();
}
この場合、式 z = f1()+f2() をチェックする際に、Polyspace は f1()f2() の本体をチェックします。g() の本体はチェックされません。

トラブルシューティング

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

すべて展開する

int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)]) 
void main () {
    int i=0, k=0;

    COPY_ELEMENT (k);         // Compliant 
    COPY_ELEMENT (i++);    // // Non-compliant  
}

この例では、ステートメント COPY_ELEMENT(i++) において、i++ が 2 回発生し、2 つの式の評価順序が指定されていないためルールに違反します。

void f (unsigned int param1, unsigned int param2) {}

void main () {
    unsigned int i=0;
    f ( i++, i );                 // Noncompliant 
}

この例では、演算 i++ が 2 番目の引数を f に引き渡す前または後に実行されるのか指定されていないため、ルールに違反します。呼び出し f(i++,i)f(0,0) または f(0,1) に変換できます。

volatile int a, b;
int mathOp(int x, int y);

int foo(void){
	int temp = mathOp(5,a) + mathOp(6,b);//Noncompliant
	return temp * mathOp(a,a);//Noncompliant
}

この例では、このルールに 2 回違反します。

  • temp の宣言で、2 つの volatile オブジェクトが式で使用されています。volatile オブジェクトは随時、その値を変更可能であるため、評価順序によっては、式が異なる値に評価される可能性があります。Polyspace は、式内の 2 番目の volatile オブジェクトにフラグを設定します。

  • return ステートメントで、同じ volatile オブジェクトが 2 回使用されています。この式の結果は評価順序によって異なる可能性があるため、Polyspace はこの欠陥を報告します。

チェック情報

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

バージョン履歴

R2019a で導入

すべて展開する