[R8C][M16C] setlocaleは誰も使わないかもしれないが...
今回もR8CおよびM16C用の純正コンパイラNC30付属の標準ライブラリの話題です。今回取り上げるのは setlocal.c です。名前からもわかるように、setlocale関数を定義しています。
このソースコードは、最初は1999年に書かれたもののようです。改訂履歴がありませんので、おそらくはCopyrightの年を変えただけで、実際のコードは何も修正されてこなかったのだろうと思います。普通なら、十数年の実績があるコードといえるわけですが、実際にはベンダも含めてまともに使った、あるいは評価した人は誰もいないのではないかと思います。
この関数の最初の部分は第一引数の正当性を評価していますが、括目してよく見ると、とんでもないバグが見えてきます。
switch (category) {
case LC_ALL:
case LC_COLLATE:
case LC_CTYPE:
case LC_MONETARY:
case LC_NUMERIC:
case LC_TIME:
break;
defaults:
return NULL;
}
case LC_ALL:
case LC_COLLATE:
case LC_CTYPE:
case LC_MONETARY:
case LC_NUMERIC:
case LC_TIME:
break;
defaults:
return NULL;
}
なんと! default ではなく defaults となっているではありませんか? こんな初歩的かつチープなバグが残っているとは...。setlocale関数は、選択が不適切な場合は空ポインタを返す仕様になっていますが、第二引数に"C"または""を指定した場合は"C"を返してしまいます。
もっとも、NC30は"C"ロケールしか扱っていませんのでロケールが変更されることはなく、このバグが致命傷になることはまずないでしょう。ただ、こういうバグは、おそらく他にもたくさんあるはずですので、このライブラリはあまり過信しない方がよいでしょう。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/937

