AliceMLの整数変換のバグ [SML]
符号付き整数(2の補数表現)が31ビットのシステムで最小の負数は-1073741824で、これはC0 00 00 00のバイト列に対応する。
AliceML 1.4ではこの値を32ビット符号なし整数から31ビット符号付き整数に変換しようとするとオーバーフローしてしまう。
SML/NJでは、整数の精度は同じだが正しく変換できる。
仕様では「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
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
2014-01-13 01:01
nice!(0)
コメント(0)
トラックバック(0)
コメント 0