[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;
  }

なんと! default ではなく defaults となっているではありませんか? こんな初歩的かつチープなバグが残っているとは...。setlocale関数は、選択が不適切な場合は空ポインタを返す仕様になっていますが、第二引数に"C"または""を指定した場合は"C"を返してしまいます。

もっとも、NC30は"C"ロケールしか扱っていませんのでロケールが変更されることはなく、このバグが致命傷になることはまずないでしょう。ただ、こういうバグは、おそらく他にもたくさんあるはずですので、このライブラリはあまり過信しない方がよいでしょう。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/937
このエントリーを含むはてなブックマーク