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

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

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

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

  1. HTTPS

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

最終更新: 2011-01-06

PRE30-C. 文字列連結によってユニバーサル文字名を作成しない

C99 がサポートするユニバーサル文字名は、標準文字セットに含まれない文字を指定するために、識別子、文字定数、文字列リテラルで使用される。ユニバーサル文字名 \Unnnnnnnn は、8 桁の識別子(ISO/IEC10646 で規定される)が nnnnnnnn である文字を指定する。同様に、ユニバーサル文字名 \unnnn は、4桁の識別子が nnnn (8桁の識別子にすると 0000nnnn) である文字を指定する。

トークンの連結の結果として生成される文字の並びがユニバーサル文字名の構文規則に一致する場合、その動作は未定義である。

一般に、どうしても必要な場合以外、識別子にユニバーサル文字名を使用するのは避けるべきだ。ほとんどすべての識別子は、標準文字セットで十分記述できるはずである。

違反コード

以下のコード例は、トークンの連結によってユニバーサル文字名を生成しているため、ルールに違反している。

#define assign(uc1, uc2, uc3, uc4, val) \
  uc1##uc2##uc3##uc4 = val;

int \U00010401\U00010401\U00010401\U00010402;
assign(\U00010401, \U00010401, \U00010401, \U00010402, 4);
適合コード

以下の解決法は、ルールに適合している。

#define assign(ucn, val) ucn = val;

int \U00010401\U00010401\U00010401\U00010402;
assign(\U00010401\U00010401\U00010401\U00010402, 4);
リスク評価

トークンの連結によりユニバーサル文字名を作成すると、未定義の動作となる。

ルール 深刻度 可能性 修正コスト 優先度 レベル
PRE30-C P2 L3
参考情報
  • [ISO/IEC 10646-2003]
  • [ISO/IEC 9899:1999] Section 5.1.1.2, "Translation phases," Section 6.4.3, "Universal character names," and Section 6.10.3.3, "The ## operator"
翻訳元

PRE30-C. Do not create a universal character name through concatenation

Top へ