Home > ラーニング > セキュアコーディング > C セキュアコーディングスタンダード > 01. プリプロセッサ (PRE)
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 |
PRE30-C. Do not create a universal character name through concatenation