SSブログ

AliceMLの整数変換のバグ [SML]

符号付き整数(2の補数表現)が31ビットのシステムで最小の負数は-1073741824で、これはC0 00 00 00のバイト列に対応する。

AliceML 1.4ではこの値を32ビット符号なし整数から31ビット符号付き整数に変換しようとするとオーバーフローしてしまう。

- Int.precision;
val it : int option = SOME 31
- LargeWord.wordSize;
val it : int = 32
- LargeWord.toIntX (LargeWord.<< (Word.toLarge 0wxc0, 0w24));
Uncaught exception
   Overflow


SML/NJでは、整数の精度は同じだが正しく変換できる。

- Int.precision;
val it = SOME 31 : int option
- LargeWord.wordSize;
val it = 32 : int
- LargeWord.toIntX 0wxc0000000;
val it = ~1073741824 : int
- LargeWord.toIntX (LargeWord.<< (Word.toLarge 0wxc0, 0w24));
val it = ~1073741824 : int


仕様では「They raise Overflow if the target integer value cannot be represented as an Int.int. 」となっている。

http://www.standardml.org/Basis/word.html#SIG:WORD.toIntX:VAL

「if and only if」とは書いていないから表現できるときもOverflowを投げていいのだと解釈できないこともないけど…。

AliceMLは2007年のリリースが最後で、もうメンテナンスされていないのかもしれない。BTSにもアクセスできない。

https://www.ps.uni-saarland.de/alice/contact.html#bugzilla
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。