C and C++


LANG.STRUCT.SE.LOGIC : 論理オペランドの副作用

要旨

左オペランド && 右オペランド
/* または */
左オペランド || 右オペランド

副作用を含む右オペランドに伴い発生します。

このチェックのために:

プロパティ

クラス名 Side Effects in Logical Operand
日本語クラス名 論理オペランドの副作用
クラス分類 スタイル (style)
ニーモニック LANG.STRUCT.SE.LOGIC
カテゴリー
MisraC2023 MisraC2023:13.5 The right hand operand of a logical && or || operator shall not contain persistent side effects
Misra2012 Misra2012:13.5 The right hand operand of a logical && or || operator shall not contain persistent side effects
Misra2004 Misra2004:12.4 The right-hand operand of a logical && or || operator shall not contain side effects
AUTOSARC++14 AUTOSARC++14:M5-14-1 The right hand operand of a logical &&, || operators shall not contain side effects.
MisraC++2008 MisraC++2008:5-14-1 The right hand operand of a logical && or || operator shall not contain side effects.
MisraC++2023 MisraC++2023:8.14.1 The right hand operand of a logical && or || operator shall not contain persistent side effects
JSF++ JSF++:157 The right hand operand of a && or || operator shall not contain side effects.
JPL JPL:19 Do not use expressions with side effects.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Side Effects in Logical Operand"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

#include <string.h>

int f(int i);
int g(int i) __attribute__((const));
int h(int i) __attribute__((pure));

int SE_LOGIC(int x, int y, volatile int *z, char *s){ 
    y += (!(x--) && y);                         /* side effect on LHS only */

    y += (x && !(y--));        /* 'Side Effect in Logical Operand' warning issued here */

    y += ((y > 5) || f(y));    /* 'Side Effect in Logical Operand' warning issued here */

    y += ((y > 5) || g(y));                     /* g() declared with __attribute__(const) */

    y += ((y > 5) || h(y));                     /* h() declared with __attribute__(pure) */

    y += ((y > 5) || strlen(s));                /* strlen() matches a factory setting for SIDE_EFFECT_FREE_FUNCTIONS */

    y += ((y > 5) || (y = 10));  /* 'Side Effect in Logical Operand' warning issued here */

    y += ((y > 5) || z);                         /* pointer is not itself volatile */

    y += ((y > 5) || *z);        /* 'Side Effect in Logical Operand' warning issued here */

    y += ((y > 5) || z[0]);      /* 'Side Effect in Logical Operand' warning issued here */

    return y;
}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。