Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 01. プリプロセッサ (PRE)
型をエンコードするときは、マクロ定義 (#define) より 型定義 (typedef) を選ぶこと。型定義はスコープの規則に従うが、マクロ定義は従わない。また、型定義はポインタ型を正確にエンコードできるが、これは型定義の実装が単なるテキスト置換ではないからである。たとえば以下の型定義では、変数 p は char への定数ポインタとして宣言されている。[Summit 05]
typedef char *NTCS; const NTCS p = &data;
型定義はテキスト置換を用いて実装されていると思っている開発者にとって、これは混乱をまねくかもしれない。Dan Saks は、型を修飾するときは最も右の宣言指定子として型修飾子を配置することを推奨している。[Saks 99] この方が混乱が少ないと思う開発者もいるだろうが、このプラクティスは推奨されない。というのも、広く採用されているプラクティスと矛盾しているし、経験豊富なプログラマには誤解を与えるおそれがあるからだ。
このコード例では、s1 は char * として宣言されているが、s2 は char として宣言されている。これは恐らくプログラマの意図したところではない。
#define cstring char * cstring s1, s2;
このコード例は、「DCL04-C. ひとつの宣言で2つ以上の変数を宣言しない」にも違反している。
以下の解決法では、s1 も s2 も char * として宣言されている。
typedef char * cstring; cstring s1; cstring s2;
| レコメンデーション | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
|---|---|---|---|---|---|
| PRE03-C | 低 | 低 | 中 | P2 | L3 |
LDRA tool suite V 7.6.0 はこのレコメンデーションの違反を検出することができる。