メインコンテンツ

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

MISRA C++:2023 Rule 4.1.3

There shall be no occurrence of undefined or critical unspecified behaviour

R2024b 以降

説明

ルール定義

There shall be no occurrence of undefined or critical unspecified behaviour. 1

根拠

未定義の動作または重要な未指定の動作のインスタンスが含まれる C++ コードは、予期せぬ結果や不正確な結果をもたらす可能性があります。このようなコードは、実装ごとに動作が異なる可能性があります。コードでの未定義の動作が原因で発生する問題は、解析するのが困難です。これは、コンパイラが、未定義の動作が発生しないことを前提としてコードを最適化する可能性が考えられるためです。また、特定のテスト データ セットではコードが想定どおりに動作する場合もあるため、このような動作をテスト時に検出するのも困難です。

メモ

多くの MISRA C++:2023 ルールでは、特定の未定義の動作または重要な未指定の動作に対応しています。このルールは、他のルールで対応されていないあらゆる未定義の動作または重要な未指定の動作に適用されます。

Polyspace 実装

Polyspace® は、以下の未定義の動作または重要な未指定の動作のインスタンスに対して違反を報告します。

  • offsetof の未定義の使用:

    • ビット フィールドでの offsetof の使用

    • 2 番目の引数が最初の引数の構造体フィールドではない場合の offsetof の使用

  • シフト演算子の未定義の使用:

    • シフト演算子の右辺での負のオペランドの使用

    • 右辺のオペランドが左辺のオペランドのデータ型のビット サイズ以上であるシフト演算子の使用

  • 整数定数のオーバーフローの発生:

    • コンパイル時の整数定数が、その値を格納できないデータ型の符号付き整数変数に代入されている。

    • 潜在型が符号付きである場合に、列挙の潜在型に収まらない列挙値が使用されている。

    • オーバーフローを発生させる 2 つの整数定数を含む二項演算が実行されている。つまり、結果の値が、演算で使用されているデータ型の許容範囲外になります。整数定数を使用する二項演算では signed int データ型が使用されます。ただし、uL などの修飾子を使用する場合は、その限りではありません。

  • defined 演算子の未定義の使用:

    • 識別子のない defined の使用

    • 展開に defined 演算子が含まれるマクロの使用

  • 不完全な型の配列の使用

  • 誤った数の引数を渡す関数形式のマクロの使用

トラブルシューティング

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

すべて展開する

#include <cstdint>

#define X 1

#define DEFINED defined
#if DEFINED(X) //Noncompliant
#endif

void test(void) {
  int16_t i = static_cast<int16_t>(0xFFFFFF); //Noncompliant

  i = i >> 17; //Noncompliant
}

この例では、このコードは、次のような未定義の動作または重要な未指定の動作につながるため、このルールの違反となります。

  • DEFINED マクロの展開に、defined 演算子が含まれている。

  • 整数定数 0xFFFFFF を 16 ビット符号付き整数型にキャストすると、オーバーフローが発生する。

  • 16 ビットの変数 i の 17 ビットの右シフトが未定義である。

チェック情報

グループ: 一般的な原則
カテゴリ: 必要

バージョン履歴

R2024b で導入


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.