JPCERT コーディネーションセンター

安全・安心なIT社会のための、国内・国際連携を支援する

お問い合わせ サイトマップ English

Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 01. プリプロセッサ (PRE)

  1. HTTPS

01. プリプロセッサ (PRE)

最終更新: 2010-07-26

PRE03-C. 型をエンコードするには define よりも typedef を選ぶ

型をエンコードするときは、マクロ定義 (#define) より 型定義 (typedef) を選ぶこと。型定義はスコープの規則に従うが、マクロ定義は従わない。また、型定義はポインタ型を正確にエンコードできるが、これは型定義の実装が単なるテキスト置換ではないからである。たとえば以下の型定義では、変数 pchar への定数ポインタとして宣言されている。[Summit 05]

typedef char *NTCS;
const NTCS p = &data;

型定義はテキスト置換を用いて実装されていると思っている開発者にとって、これは混乱をまねくかもしれない。Dan Saks は、型を修飾するときは最も右の宣言指定子として型修飾子を配置することを推奨している。[Saks 99] この方が混乱が少ないと思う開発者もいるだろうが、このプラクティスは推奨されない。というのも、広く採用されているプラクティスと矛盾しているし、経験豊富なプログラマには誤解を与えるおそれがあるからだ。

違反コード

このコード例では、s1char * として宣言されているが、s2char として宣言されている。これは恐らくプログラマの意図したところではない。

#define cstring char *
cstring s1, s2;

このコード例は、「DCL04-C. ひとつの宣言で2つ以上の変数を宣言しない」にも違反している。

適合コード

以下の解決法では、s1s2char * として宣言されている。

typedef char * cstring;
cstring s1;
cstring s2;
リスク評価
レコメンデーション 深刻度 可能性 修正コスト 優先度 レベル
PRE03-C P2 L3
自動検出

LDRA tool suite V 7.6.0 はこのレコメンデーションの違反を検出することができる。

参考情報
  • [ISO/IEC 9899:1999] Section 6.7, "Declarations"
  • [ISO/IEC PDTR 24772] "NMP Pre-processor Directives"
  • [Saks 99]
  • [Summit 05] Question 1.13, Question 11.11
翻訳元

PRE03-C. Prefer typedefs to defines for encoding types

Top へ