メインコンテンツ

MISRA C:2023 Rule 13.1

Initializer lists shall not contain persistent side effects

R2024a 以降

説明

ルール定義

Initializer lists shall not contain persistent side effects 1 .

根拠

C99 は実行時のみ評価できる式が含まれる初期化子リストを許可します。ただし、リスト内の要素の評価順序は定義されていません。リスト内の要素の 1 つが別の要素で使用されている変数値を変更すると、評価順序のあいまいさにより未定義の値が発生します。したがって、このルールでは初期化子リスト内の式が、使用される変数を変更できないようにする必要があります。

Polyspace 実装

Polyspace® は、式が初期化子リスト内に出現し、その式が式内の変数を変更する場合、または volatile 変数を含んでいる場合は常に違反を報告します。

トラブルシューティング

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

すべて展開する

volatile int v;
int x;
int y;

void f(void) {
    int arr[2] = {x+y,x-y};       // Compliant
    int arr2[2] = {v,v};          // Non-compliant 
    int arr3[2] = {x++,x+y};      // Non-compliant
}

この例では、最初の初期化では、初期化子が x または y のいずれも変更しないため、ルールに違反しません。他の初期化ではルールに違反します。

  • 2 番目の初期化では、v が volatile であるため、初期化子は v を変更可能。arr2 の初期化は、どの配列要素が最初に初期化されるかによって異なります。

  • 3 番目の初期化では、初期化子が変数 x を変更。arr3 の初期化は、x++ が先に評価されるか後から評価されるかによって異なります。

チェック情報

グループ: 二次的影響
カテゴリ: 必要
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.