[Gauche-devel-jp] string->number

Back to archive index

Shiro Kawai shiro****@lava*****
2003年 5月 10日 (土) 21:02:47 JST


ぐはっ。痛恨のバグ。

From: OGURISU Osamu <oguri****@lagen*****>
Subject: [Gauche-devel-jp] string->number
Date: Sat, 10 May 2003 19:05:28 +0900

> gosh> (string->number "4653136.503")
> 4653136.502:
> 途中、値が0.001減って、余分な : がついてしまいます。
> なんなんでしょうか?

':' はASCIIで'0'の次の文字です。10進変換のところをしくじって、
最後の桁を'3'とすべきところを'2'にしちゃったんで、その次の桁に
行った時にオーバーフローして':'になっちゃった…と考えると
辻褄が合います。

……デバッグ中……

見つけました。

こういうバグは恐いです。このコード部分を通るのはレアケースで、
更にこの不等号が意味を持つのはその中でも一部の場合だけ、なのでした。
見つけて頂いて幸いでした。ランダムデータによるテストでは
こういうのは捕まえられませんね。
全てのブランチを通るテストケースを書かないといけないんでしょうね。

--shiro


RCS file: /cvsroot/gauche/Gauche/src/bignum.c,v
retrieving revision 1.50
diff -c -r1.50 bignum.c
*** bignum.c	21 Apr 2003 23:07:28 -0000	1.50
--- bignum.c	10 May 2003 11:33:20 -0000
***************
*** 364,370 ****
      
      if (br->size < by->size) return -1;
      for (i=br->size-1; i>=0; i--) {
!         if (i > by->size) {
              if (br->values[i]) return 1;
              continue;
          }
--- 364,370 ----
      
      if (br->size < by->size) return -1;
      for (i=br->size-1; i>=0; i--) {
!         if (i >= by->size) {
              if (br->values[i]) return 1;
              continue;
          }






Gauche-devel-jp メーリングリストの案内
Back to archive index