メインコンテンツ

CERT C: Rec.EXP10-C

部分式の評価の順序または二次的影響が発生する順序には依存しない

説明

ルール定義

部分式の評価の順序または二次的影響が発生する順序には依存しないようにします。1

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++);       /* 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) に変換できます。

チェック情報

グループ: Rec.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.