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

API08-C. 関数プロトタイプでは引数に名前をつけない

プロトタイプ宣言では引数に名前をつける必要がないどころか、得策ではない。名前をつけるとマクロ定義の影響を受ける可能性がある。

関数プロトタイプ中の識別子の有効範囲は、関数プロトタイプの宣言から始まり、関数宣言子の末尾で終わる。しかし、プリプロセッサはこの有効範囲を無視する。それゆえ、プロトタイプ宣言中の識別子が既存のマクロと同じ名前を持つと、識別子はマクロ呼出しとして扱われる。

標準ヘッダやシステムヘッダにおいて、プロトタイプ宣言中の引数名を保護することは特に重要である。ユーザが期待する動作は、ヘッダをインクルードして関数名を使用できることだけである。

違反コード

以下の違反コード例について考えてみる。

#define status 23
void update_status(int status);

このプロトタイプ宣言はプリプロセッサによって次のように置換されるため、エラーになる。

void update_status(int 23);

また、status を次のように定義していると、さらに予期せぬ結果が生じる。

#define status []

この場合、プロトタイプは次のように置換される。

void update_status(int []);

これは文法的には正しいが、本来の意図とかけ離れてしまっている。

適合コード

API ヘッダのプロトタイプ宣言がこのように誤解釈されぬよう、APIの開発者は、意図しない結果が生じないようにプロトタイプ宣言する必要がある。その方法の1つは、以下の例のように、プロトタイプ内で識別子を使用しないことである。

void update_status(int);

以下の例のように、識別子をコメントアウトする方法もある。

void update_status(int /* ステータス */);

コメントは変換処理の第 2 段階で 1 個のスペース文字に変換される。

リスク評価

ヘッダのプロトタイプ宣言における誤解釈を防止しないと、プログラム内で型に関するエラーが発生する可能性がある。

ルール

深刻度

可能性

修正コスト

優先度

レベル

API08-C

P4

L3

自動検出
ツール バージョン チェッカー 説明

ECLAIR

1.1

funparid

Fully implemented

参考資料
[ISO/IEC 2003]
翻訳元

これは以下のページを翻訳したものです。

API08-C. Avoid parameter names in a function prototype (revision 20)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter