メインコンテンツ

MISRA C:2023 Rule 12.3

The comma operator should not be used

R2024a 以降

説明

ルール定義

The comma operator should not be used 1 .

根拠

コンマ演算子は可読性を低下させる可能性があります。通常、同一のコードを別の形式で記述できます。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

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コンマを初期化に使用するときに、変数とその値が一見してわかるようになっています。

チェック情報

グループ:
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2024a で導入


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.