メインコンテンツ

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

CERT C: Rule EXP30-C

二次的影響に関して評価の順序に依存しない

説明

ルール定義

二次的影響に関して評価の順序に依存しないようにします。1

Polyspace 実装

ルール チェッカーは、"式の値が評価または二次的影響の順序に依存" をチェックします。

すべて展開する

問題

この問題は、式の値とその永続的な二次的影響が、許可されているすべての評価順序に対して異なる場合に発生します。

以下の条件で、式は異なる値をもつことができます。

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

  • 式が複数の評価順序を許可している。

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

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

したがって、このルールでは、変数が複数回変更され、評価順序によって結果が異なる可能性がある式を禁止しています。

リスク

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

例 — 式で複数回変更される変数
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++);       /* Noncompliant  */
}

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

例 — 複数の関数の引数で変更され使用される変数
void f (unsigned int param1, unsigned int param2) {}

void main () {
    unsigned int i=0;
    f ( i++, i );                 /* Non-compliant */ 
}

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

例 — 式に含まれる複数の volatile オブジェクト
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 はこの欠陥を報告します。

チェック情報

グループ: Rule 03.式 (EXP)

バージョン履歴

R2019a で導入

すべて展開する


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.