オブジェクトとして使用される事前定義されたマクロ
assert や errno などの標準ライブラリのマクロをオブジェクトとして使用する
説明
この欠陥は、基になるオブジェクトの存在が必要な方法で、特定の識別子を使用した場合に発生します。これらの識別子はマクロとして定義されます。C 標準では、これらをオブジェクトとして再定義することは許可されていません。識別子のマクロ展開が発生する可能性がないような方法で識別子を使用します。
たとえば、外部変数 errno を参照します。
extern int errno;
errno は変数ではなくマクロとして発生します。この欠陥が当てはまるマクロは、assert、errno、math_errhandling、setjmp、va_arg、va_copy、va_end、および va_start です。チェッカーは、(ヘッダー ファイルではなく) ソース ファイル内にある欠陥のみを調べます。
リスク
C11 規格 (節 7.1.4) では、ほとんどのマクロをオブジェクトとして再定義することが許可されています。ソース ファイルのオブジェクトにアクセスし、マクロにアクセスしないようにするには、以下のいずれかを行います。
識別子を外部変数または関数として再宣言する。
関数形式のマクロについては、識別子名を小かっこで囲む。
オブジェクトとして再定義できないマクロにこれらの手法を使用しようとすると、エラーが発生します。
修正方法
マクロ展開が抑制されるような方法で識別子を使用しないようにします。
識別子を外部変数または関数として再宣言しない。
関数形式のマクロについては、マクロ名を小かっこで囲まない。
例
結果情報
| グループ: プログラミング |
| 言語: C | C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: MACRO_USED_AS_OBJECT |
| 影響度: Low |
バージョン履歴
R2018a で導入