メインコンテンツ

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

MISRA C++:2008 Rule 5-18-1

The comma operator shall not be used

説明

ルール定義

The comma operator shall not be used. 1

根拠

コンマ演算子は 2 つのオペランドを取ります。演算子は左から右に評価されて、左オペランドの値が破棄され、右オペランドの値が返されます。この演算子の優先順位は、演算子の中で最も低くなっています。これらのプロパティにより、コンマ演算子の使用が直感的でなくなっています。たとえば、次のコードを考えます。

array[i++,j] = 1
一見すると、上記のコードは多次元配列にアクセスするように見えます。実際には、このコードは以下と等価です。
i++;
array[j] = 1;
コンマ演算子を使用すると、コードの可読性が低くなり、保守が困難になります。混乱を避けるには、コンマ演算子を使用しないでください。代わりに、式を複数のステートメントにリファクタリングします。

Polyspace 実装

Polyspace® は、コンマ演算子の使用にフラグを設定します。関数呼び出しと初期化にコンマ演算子を使用する場合、違反は報告されません。

トラブルシューティング

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

すべて展開する

typedef signed int abc, xyz, jkl;
static void func1 ( abc, xyz, jkl );       /* Compliant - case 1 */
int foo(void)
{
    volatile int rd = 1;                   /* Compliant - case 2*/
    int var=0, foo=0, k=0, n=2, p, t[10];  /* Compliant - case 3*/
    int abc = 0, xyz = abc + 1;            /* Compliant - case 4*/
    int jkl = ( abc + xyz, abc + xyz );    /* Noncompliant - case 1*/
    var = 1, foo += var, n = 3;          /* Noncompliant - case 2*/ 
    var = (n = 1, foo = 2);              /* Noncompliant - case 3*/
    for ( int *ptr = &t[ 0 ],var = 0 ;
          var < n; ++var, ++ptr){}    /* Noncompliant - case 4*/
    if ((abc,xyz)<0) { return 1; }         /* Noncompliant - case 5*/
}

この例では、コードは C コードでのコンマのさまざまな用途を示しています。

準拠していないケース
ケース非準拠の理由
1コードを読み取るときに、jkl が何に初期化されているのかがすぐにはわかりません。たとえば、jkl の値は abc+xyz(abc+xyz)*(abc+xyz)f((abc+xyz),(abc+xyz)) などであると推測できます。
2コードを読み取るときに、ステートメント後の foo の値が 0 か 1 かがすぐにはわかりません。
3コードを読み取るときに、var にどの値が代入されるのかがすぐにはわかりません。
4コードを読み取るときに、どの値が for ループを制御しているのかがすぐにはわかりません。
5 コードを読み取るときに、if ステートメントが abcxyz または両方のいずれに依存しているのかがすぐにはわかりません。
準拠しているケース
ケース準拠の理由
1変数を伴う関数の呼び出しにコンマを使用するのは許可されています。
2コンマ演算子は使用されていません。
3 & 4コンマを初期化に使用するときに、変数とその値が一見してわかるようになっています。

チェック情報

グループ: Expressions
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.