STR09-C. 単なる文字型の式に対して数値を想定しない
アプリケーションの可搬性を確保するために、単なる文字型や単なるワイド文字型の式に対しては、代入演算子 (=
)、等価演算子 (==
と !=
) および単項 &
演算子のみを使用する。
C 標準は、数字 (0–9) に限り、連続した値を持つことだけを要求している。したがって、単なる文字型あるいは単なるワイド文字型の式が決まった値となることを想定した演算を行うと、未定義の動作を引き起こす可能性がある。
しかし、数字は連続した値を持つという要請に基づき、次の制限に従って他の演算子を使用してもよい。
- 0 に対して 0 から 9 までの整数値を加算するときには、2項演算子
+
を使用してよい。 - 整数値から文字 0 を減算するときには、2項演算子
-
を使用してよい。 - 文字やワイド文字が数字かどうか調べるときに、関係演算子
<
、<=
、>
、>=
を使用してよい。
文字型は、「STR04-C. 基本文字集合にある文字を表すには単なる char を使用する」に従って選択、使用するべきである。
違反コード
以下のコード例では、文字変数の値が 'a'
から 'c'
までの範囲にあるか ('a'
と 'c'
を含む) を調べようとしている。しかし、C 標準では英文字が連続していること、つまりアルファベット順であることを要求していないため、この検査は意図したとおりに動作しない可能性がある。
char ch = 'b'; if ((ch >= 'a') && (ch <= 'c')) { /* ... */ }
適合コード
次の例では、文字の式に対して適切な演算を使用して上記の検査を行っている。
char ch = 't'; if ((ch == 'a') || (ch == 'b') || (ch == 'c')) { /* ... */ }
例外
STR09-EX0: ASCII または Unicode が使われているプラットフォーム上では、a
から z
のような文字が連続した値となることを想定してよい。このレコメンデーションが意図しているのは、たとえば、ASCII システムから非 ASCII システムにコードを移行する場合など、異なるプラットフォーム間の可搬性である。
リスク評価
ルール |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
STR09-C |
低 |
低 |
低 |
P3 |
L3 |
関連するガイドライン
CERT C++ Secure Coding Standard | STR07-CPP. Don't assume numeric values for expressions with type plain character |
参考資料
[Jones 2009] | Section 5.2.1, "Character Sets" |
翻訳元
これは以下のページを翻訳したものです。
STR09-C. Don't assume numeric values for expressions with type plain character (revision 41)