メインコンテンツ

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

MISRA C:2012 Rule 1.3

There shall be no occurrence of undefined or critical unspecified behaviour

説明

ルール定義

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

根拠

未定義の動作または重要な未指定の動作につながる C コードは、予期せぬ結果や不正確な結果をもたらす可能性があります。このようなコードは、実装ごとに動作が異なる可能性があります。コードでの未定義の動作が原因で発生する問題は解析が困難です。これは、コンパイラが、未定義の動作が発生しないことを前提としてコードを最適化する可能性があるためです。

メモ

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

Polyspace 実装

Polyspace® は、以下の未定義の動作または重要な未指定の動作にフラグを設定します。

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

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

  • 識別子のない defined の使用。

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

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

  • 誤った数の引数を使用した関数形式のマクロの使用 (C90 のみ)。

トラブルシューティング

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

すべて展開する

#include <stddef.h>     
static int bar = 0;
extern int bar;         /* Violation (8.8)*/

struct str {
  char a:8;
  char b[10];
  char c;
};
void foo() {
  
  offsetof(struct str, a);//Noncompliant
  offsetof(struct str, d);//Noncompliant
}

この例では、関数 foo がビット フィールド str.a に対してマクロ offsetof を使用します。この動作は未定義です。Polyspace はこれにフラグを設定します。関数はその後、str.doffsetof を呼び出します。dstr のフィールドではないため、Polyspace はこれにフラグを設定します。これらの問題はコンパイル エラーを引き起こす可能性があります。

変数 bar は、内部リンクと外部リンクの両方を使用して宣言されています。C99 規格によると、同じファイル内で内部ストレージと外部ストレージの両方をもつように変数を宣言することは未定義の動作です。Polyspace はルール 8.8 に対する違反として、この未定義の動作にフラグを設定します。MISRA C:2012 Rule 8.8 を参照してください。

チェック情報

グループ: 標準 C 環境
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2014b で導入

すべて展開する


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.