C/C++に文字エンコーディングバリデーション機能がないって、ほんと?

通りすがり (2009-09-16 18:09)

> PHP以外の言語は「(略)」のに対し
ここに挙げられている言語がWebアプリで使われる全ての言語ではない。
例えば、CやC++にはない。付け足せば、PHPPerlなどのCモジュール内部で起こった不正な文字はスルーされうる。
よって、「PerlJava、.NET、RubyPHPの中では」と書けば筋は通るが、「PHP以外では」は誤り。
そしてそんなことを、PHPの(脆弱性撲滅に注力している)開発者に言ったら、喧嘩を売られたと受け止められて当然。

PHP以外では: 既にあたり前になりつつある文字エンコーディングバリデーション - 徳丸浩の日記(2009-09-14)

というコメントが気になった。

C言語にある文字コード変換機能って言ったら mbtowc だと思うけど、mbtowc は無効なバイト列を受け取ると EILSEQ を返すことになっている。少なくとも OSX 10.5.8, FreeBSD 6.3, CentOS 5 では、"\xc0\xaf" を渡すと、ちゃんと EILSEQ を返す。

$ C -ilocale.h -istdlib.h -cWall -e 'wchar_t wc; printf("%s\n", setlocale(LC_ALL, "ja_JP.UTF-8")); printf("%d\n", mbtowc(&wc, "\xc0\xaf", 2)); perror("")'
ja_JP.UTF-8
-1
無効または不完全なマルチバイトまたはワイド文字です

mbtowc よりも実際によく使われる ICU みたいなライブラリにも、無効なバイト列を弾く機能はある (というか、PHP6 からは ICU を使って文字コード変換するんですよね)。

というわけで、(文字エンコーディングバリデーション機能が)「CやC++にはない」という「通りすがり」さんの指摘は誤り。そんなことをCの(文字コード変換ライブラリを作っているor使っている)開発者に言ったら、喧嘩を売られたと受け止められて当然。

... なんじゃないかなーと思った。