[cmucl-ticket] #19: Modular arith bug 2
cmucl
cmucl-devel at common-lisp.net
Tue Aug 12 16:20:47 UTC 2008
#19: Modular arith bug 2
--------------------+-------------------------------------------------------
Reporter: rtoy | Owner: somebody
Type: defect | Status: new
Priority: major | Milestone:
Component: Core | Version: 19b
Keywords: |
--------------------+-------------------------------------------------------
This was reported by Martin Cracauer to cmucl-imp, 2005-07-20.
{{{
(defun fixnum-hasher (a)
(declare
(optimize (speed 3) (safety 0) #+nil(debug 1)) ;; BUG HERE, only in
fast mode
(type fixnum a)) ;; bug equally apears if you leave this out
(logand
(the fixnum ;; BUG HERE. Drop this declaration and the bug disappears
(logxor (ash a -20) -482305527))
1023))
}}}
Repeatedly calling {{{(fixnum-hasher 27)}}} returns random values! The
problem is caused by modular arithmetic because if it is turned off (by
{{{setf c::*enable-modular-arithmetic* nil)}}} the bug doesn't happen.
The answer should be 521.
A related bug is
{{{
(defun foo (a b)
(locally (declare (optimize (speed 3) (safety 0) (debug 1)))
(the fixnum
(logand (the fixnum
(logxor (the fixnum a)
(the fixnum b)))
(the fixnum (1- (ash 1 18)))))))
}}}
This bug is mentioned in the same thread, but is from sbcl-devel, 2005-04-
29.
{{{(foo -1234 1234)}}} returns random values. The correct answer is
262140.
In both cases, there is a call to vm::logxor-mod32 with fixnum args,
returning an unsigned 32-bit result. This is not right.
--
Ticket URL: <http://trac.common-lisp.net/cmucl/ticket/19>
cmucl <http://common-lisp.net/project/cmucl>
cmucl
More information about the cmucl-ticket
mailing list