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

STR04-C. 基本文字集合にある文字を表すには単なる char を使用する

文字型には、charsigned charunsigned 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. 高い警告レベルで警告を出さずにコンパイルする」に従って高い警告レベルでコンパイルすると、次の場合に警告が発行される。

これらの警告が出ないようにするにはキャストする必要があるが、キャストが多すぎるとコードが読みにくくなり、出るべき警告メッセージが隠れてしまうことがある。

この 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

 

signed char を含む場合を除き、CERT C Rule Pack でこのルールへの違反を検出できる。

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)

Top へ

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