Not only is the Internet dead, it's starting to smell really bad.:2007年11月05日分

2007/11/05(Mon)

[NetBSD] lib/36938 その2

glibcが``初期化する''として実装しているというか、これmbstate_tの使い方の問題だな。
今のcitrus_utf8.cの実装では

219	/* make sure we have the first byte in the buffer */
220	if (psenc->chlen == 0) {
221		if (n-- < 1)
222			goto restart;
223		psenc->ch[psenc->chlen++] = *s0++;
224	}
225
226	c = _UTF8_count[psenc->ch[0] & 0xff];
227	if (c < 1 || c < psenc->chlen)
228		goto ilseq;

としてるので、223行目でmbstate_tにmulti-byteの先頭1byte読み込んでから
(つまり非initial stateになる)226行目でUTF-8の1byte目かのチェック行うからなんだけど
glibcはおそらく、最初の1byte目のチェックが終わるまでmbstate_tに保存しないので
illegal byte sequenceの場合でもinitiail stateのままになるるっぽい。
ちなみにSolarisもVC++も同様の動きするね。

どっちみちこれ実装依存の未定義動作だと思うので
stateless encodingだからって初期化をサボっていいなんて理由はないはずなんだがな。
こんなとこまでglibcに動作あわせる必要はないと思うが、それを英語で説明書けるほど今頭が働いてない。

週末

草津白根で遊ぼうと思ってたんだけど、風邪こじらせてキャンセル。
ぷらっとから届いたSolaris 10 8/7 MediaKitも放置して寝込んでた。

名札は縦書きなのでtnozaki@併記は無理らしい、multiscriptは難しいとしみじみ。