メインコンテンツ

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

CERT C: Rule DCL37-C

予約済みの識別子を宣言または定義しない

説明

ルール定義

予約済みの識別子を宣言または定義しないようにします。1

Polyspace 実装

ルール チェッカーは以下の問題をチェックします。

  • 予約された識別子またはマクロの定義または定義解除

  • 予約された識別子またはマクロ名の宣言

コードで予約済みの識別子が宣言または定義されている場合は、次のようになります。

  • 明示的な定義がある場合、Polyspace® はこれにフラグを設定します。

  • 明示的な定義がない場合、コードでシンボルが使用されていると、コンパイラにより暗黙的な定義が作成されます。Polyspace はこのような使用にフラグを設定します。

この違反は、非準拠の識別子ごとに 1 回報告されます。

すべて展開する

問題

この問題は、予約された識別子または予約されたマクロ名に対して #define および #undef を使用した場合に発生します。

リスク

予約された識別子と予約されたマクロ名は実装での使用が想定されています。予約されたマクロの意味を削除または変更すると、未定義の動作が発生する可能性があります。このルールは以下に適用されます。

  • アンダースコアで始まる識別子またはマクロ名

  • C 標準ライブラリに記述されたファイル スコープの識別子 (ISO® /IEC 9899:1999、節 7、"Library")

  • C 標準ライブラリに記述されているマクロ名で標準のヘッダー内で定義されているもの (ISO /IEC 9899:1999、節 7、"Library")

例 - 予約された識別子の定義または定義解除
#undef __LINE__               /* Non-compliant - begins with _ */
#define _Guard_H 1            /* Non-compliant - begins with _ */
#undef _ BUILTIN_sqrt        /* Non-compliant - implementation may
                               * use _BUILTIN_sqrt for other purposes,
                               * e.g. generating a sqrt instruction */
#define defined               /* Non-compliant - reserved identifier */
#define errno my_errno        /* Non-compliant - library identifier */
#define isneg(x) ( (x) < 0 )  /* Compliant - rule doesn't include  
                               * future library directions   */
問題

この問題は、予約された識別子またはマクロ名を宣言する場合に発生します。

標準ライブラリ マクロ、オブジェクトまたは関数に対応するマクロ名を定義する場合、Polyspace は、これをルールに違反していると見なします。

ルールでは仮定義は定義と見なされます。

リスク

規格では予約された識別子を特別に扱う実装を許可しています。予約された識別子を再利用する場合、未定義の動作が発生する可能性があります。

チェック情報

グループ: Rule 02.宣言と初期化 (DCL)

バージョン履歴

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.