STR04-C. 基本文字集合にある文字を表すには単なる char を使用する
文字型には、char
、signed char
、unsigned char
の 3 種類がある。処理系は、char
を、signed char
または unsigned char
のいずれかと同じ値の範囲、同じ表現形式、同じ動作をするものとして定義しなければならない。char
はどちらに定義されたとしても、signed char
とも unsigned char
とも異なる型であり、これらの型と互換性はない。
基本文字集合にある文字には、型に互換性があれば、どちらのデータ型を使ってもかまわない。それゆえ、標準の文字列処理関数との互換性を考慮して、文字データを表すには単なる char
を使用するのがよい。
ほとんどの場合、単なる char
型に対して唯一可搬性のある演算子は、代入演算子と等価演算子である(=
、==
、!=
)。ただし数字との間の変換は例外であり、たとえば、char
c
が数字の場合、c - '0'
は 0 から 9 までの値である。
違反コード
以下のコード例では、単なる文字からなる文字列、符号付きの文字からなる文字列、および符号無しの文字からなる文字列を引数とする標準の文字列処理関数 strlen()
の呼び出しを示している。strlen()
関数は const char *
型の引数を 1 つだけ取る。
size_t len; char cstr[] = "char string"; signed char scstr[] = "signed char string"; unsigned char ucstr[] = "unsigned char string"; len = strlen(cstr); len = strlen(scstr); /* char が符号無しならば警告する */ len = strlen(ucstr); /* char が符号付きならば警告する */
「MSC00-C. 高い警告レベルで警告を出さずにコンパイルする」に従って高い警告レベルでコンパイルすると、次の場合に警告が発行される。
char
が符号付きの場合に、unsigned char[]
からconst char *
へ変換したときchar
が符号無しと定義されている場合に、unsigned char[]
からconst char *
へ変換したとき
これらの警告が出ないようにするにはキャストする必要があるが、キャストが多すぎるとコードが読みにくくなり、出るべき警告メッセージが隠れてしまうことがある。
この C コードを C++ コンパイラでコンパイルしようとすると、unsigned char[]
から const char *
の変換や、signed char[]
から const char *
への変換はエラーとなる。コンパイルするにはキャストが必要である。
適合コード
以下の適合コードでは、文字データの表現に単なる char
を使用している。
size_t len; char cstr[] = "char string"; len = strlen(cstr);
型変換する必要はなく、コードはキャストしなくても高い警告レベルで問題なくコンパイルされる。
リスク評価
基本文字集合にある文字の表現に単なる char
を使用しないと、キャストが過剰となり、コンパイラ診断の効果を下げることになる。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
STR04-C |
低 |
低 |
低 |
P3 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Compass/ROSE |
|
|
|
ECLAIR | 1.1 |
charsgnd |
実装済み |
EDG |
|
|
|
Fortify SCA |
5.0 |
|
|
PRQA QA-C | 8.1 | 0432 (C) | 部分的に実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | STR04-CPP. Use plain char for characters in the basic character set |
MISRA-C | Rule 6.1 |
翻訳元
これは以下のページを翻訳したものです。
STR04-C. Use plain char for characters in the basic character set (revision 58)