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

STR37-C. 文字処理関数への引数は unsigned char として表現できなければならない

C 標準 [ISO/IEC 9899:2011] セクション 7.4 には次のように記載されている。

ヘッダ <ctype.h> では、文字の分類やマッピングに便利な関数が宣言されている。引数はすべて int 型であり、その値は unsigned char 型として表現可能であるか、マクロ EOF の値と等しくなければならない。引数がそれ以外の値を持つ場合、動作は未定義である

(附属書 J 「未定義の動作」の 113 も参照)。

char データ型は処理系により signedunsigned のいずれかであるため、このルールへ適合するのはむずかしい。

次の文字分類関数が対象となる。

isalnum()

isalpha()

isascii() XSI

isblank()

iscntrl()

isdigit()

isgraph()

islower()

isprint()

ispunct()

isspace()

isupper()

isxdigit()

toascii() XSI

toupper()

tolower()

注意: XSI とは、ISO/IEC 9945—POSIX への X/Open システムインタフェース拡張を指す。この関数は C 標準では定義されていない。

「STR34-C. 文字データをより大きなサイズの整数型に変換するときは事前に unsigned char 型に変換する」はこのルールを汎用化したものである。

違反コード

以下のコード例では、isspace() 関数に無効な値が渡される可能性がある。

size_t count_preceding_whitespace(const char *s) {
  const char *t = s;

  /* *t < 0 かもしれない */
  while (*t && isspace(*t)) {
    ++t;
  }
  return t - s;
}

isspace() の引数は EOF、または unsigned char として表現可能な値でなければならない。それ以外の場合、結果は未定義となる。

適合コード

以下の適合コードでは、isspace() 関数の引数を unsigned char 型にキャストしている。

size_t count_preceding_whitespace(const char *s) {
  const char *t = s;

  while (*t && isspace((unsigned char)*t)) {
    ++t;
  }
  return t - s;
}
リスク評価

unsigned char 型で表現できない値を文字処理関数に渡すと、意図しないプログラム動作を引き起こす可能性がある。

ルール

深刻度

可能性

修正コスト

優先度

レベル

STR37-C

P3

L3

自動検出

ツール

バージョン

チェッカー

説明

Compass/ROSE

   

上に挙げた関数の引数が unsigned char でないかどうかをチェックすることで、このルールの違反を検出できる。

ECLAIR

1.1

idb_charplan

実装済み

PRQA QA-C 8.1 STR34 の特殊ケース 実装済み
関連するガイドライン
CERT C++ Secure Coding Standard STR37-CPP. Arguments to character handling functions must be representable as an unsigned char
ISO/IEC TS 17961 (ドラフト) Passing arguments to character-handling functions that are not representable as unsigned char [chrsgnext]
MITRE CWE CWE-704, Incorrect type conversion or cast
CWE-686, Function call with incorrect argument type
参考資料
[ISO/IEC 9899:2011] Section 7.4, "Character Handling <ctype.h>"
[Kettlewell 2002] Section 1.1, "<ctype.h> and Characters Types"
翻訳元

これは以下のページを翻訳したものです。

STR37-C. Arguments to character handling functions must be representable as an unsigned char (revision 75)

Top へ

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