mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-22 07:09:18 +02:00
Naturally, fixed-width integer arithmetics can overflow. Chibi handles it pretty well in general, but one case was missing: it is negation of the minimal negative number that can be represented as a fixnum. That is, sexp_fx_neg() must not be applied to sexp_make_fixnum(SEXP_MIN_FIXNUM) because it overflows and returns an identical fixnum back. sexp_fx_neg() itself seems to be used right in the current code, but sexp_fx_abs()--which is defined in terms of sexp_fx_neg()--could be applied to the forbidden number when used to retrieve an unboxed value via the sexp_unbox_fixnum(sexp_fx_abs(x)) pattern. So I have added a separate macro that safely calculates unboxed absolute value of a fixnum, and replaced sexp_unbox_fixnum(sexp_fx_abs(x)) usages with it. Current implementation uses two-bit tag for fixnums, plus we need one bit for the sign, so fixnums have (machine word - 3) significant bits. Regression tests cover word sizes of 16, 32, 64, and 128 bits (for the sake of past- and future-proofness). sexp_bignum_expt() does not have a regression test because we need to check it with negative exponents like -2^29, so the base must be over at least 2^(2^29) for the differences to be visible. Fun fact: bignum representation of such number takes around 1/32 of the available user- space memory, which makes testing on anything except 32-bit systems unreasonable (4 TB of RAM anyone?) |
||
---|---|---|
.. | ||
basic | ||
build | ||
ffi | ||
foreign | ||
install | ||
memory | ||
base64-tests.scm | ||
division-tests.scm | ||
filesystem-tests.scm | ||
flonum-tests.scm | ||
generic-tests.scm | ||
hash-tests.scm | ||
io-tests.scm | ||
iset-tests.scm | ||
lib-tests.scm | ||
loop-tests.scm | ||
match-tests.scm | ||
md5-tests.scm | ||
memoize-tests.scm | ||
mime-tests.scm | ||
numeric-tests.scm | ||
parse-tests.scm | ||
path-tests.scm | ||
prime-tests.scm | ||
process-tests.scm | ||
r5rs-tests.scm | ||
r7rs-tests.scm | ||
re-tests.txt | ||
record-tests.scm | ||
regexp-tests.scm | ||
rsa-tests.scm | ||
scribble-tests.scm | ||
sha-tests.scm | ||
show-tests.scm | ||
sort-tests.scm | ||
srfi-1-tests.scm | ||
srfi-2-tests.scm | ||
srfi-16-tests.scm | ||
srfi-26-tests.scm | ||
srfi-27-tests.scm | ||
srfi-33-tests.scm | ||
srfi-38-tests.scm | ||
string-tests.scm | ||
system-tests.scm | ||
tar-tests.scm | ||
term-ansi-tests.scm | ||
thread-tests.scm | ||
unicode-tests.scm | ||
uri-tests.scm | ||
weak-tests.scm |