メインコンテンツ

CERT C: Rec.MSC15-C

Do not depend on undefined behavior.

説明

ルール定義

未定義の動作に依存しないようにします。1

Polyspace 実装

ルール チェッカーは、"未定義の動作" をチェックします。

すべて展開する

問題

この問題は、未定義の動作または重要な未指定の動作を解析で検出した場合に発生します。具体的には Polyspace® は以下の未定義の動作または重要な未指定の動作にフラグを設定します。

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

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

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

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

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

リスク

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

修正方法

未定義の動作または重要な未指定の動作につながる可能性のあるコードを回避します。

例 — 未定義の動作の回避
#include <stddef.h>     /* offsetof */

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 はこれにフラグを設定します。

これらの問題はコンパイラでコンパイル エラーを引き起こす可能性があります。Polyspace はルール違反としてこの問題にフラグを設定すると同時に、コンパイル エラーを表示します。

チェック情報

グループ: Rec.48.その他 (MSC)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.