Skip to content

C言語のctype関数はASCIIの範囲しか動作を保証しない

標準Cライブラリには isalphaisdigit などの関数(マクロ)が定義されている。これらの関数は int を受け取るようになっているけれど、ASCIIや EOF 以外の値を渡したときの挙動は未定義とされる。

Plan 9のctype(2)でも同様の記述がある。

Isascii is defined on all integer values; the rest are defined only where isascii is true and on the single non–ASCII value EOF;

例えば

int c;
c = 0x100 | 'A';
if(isalnum(c)) // BUG
print("alnum\n");

ここで cisalnum の実装によって2通り考えられる。

  • 上位ビットをマスクするなら真となる
  • そのまま扱うなら偽となる