C言語のctype関数はASCIIの範囲しか動作を保証しない
標準Cライブラリには isalpha や isdigit などの関数(マクロ)が定義されている。これらの関数は 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");ここで c は isalnum の実装によって2通り考えられる。
- 上位ビットをマスクするなら真となる
- そのまま扱うなら偽となる