[Vm-dev] Interpreter>>signed32BitValueOf: and signed64BitValueOf:
broken
Igor Stasenko
siguctua at gmail.com
Thu Mar 20 04:18:44 UTC 2008
On 20/03/2008, Andreas Raab <andreas.raab at gmx.de> wrote:
>
> Hi -
>
> I just noticed hat Interpreter>>signed32BitValueOf: and
> signed64BitValueOf: are broken for edge cases. The following example
> will illustrate the problem:
>
> array := IntegerArray new: 1.
> array at: 1 put: 16rFFFFFFFF. "should fail but doesn't"
> array at: 1. "answers -1 incorrectly"
>
> array := IntegerArray new: 1.
> array at: 1 put: -16rFFFFFFFF. "should fail but doesn't"
> array at: 1. "answers 1 incorrectly"
>
> The problem is that both signed32BitValueOf: as well as
> signed64BitValueOf: do not test whether the high bit of the magnitude is
> set (which it mustn't to fit into a signed integer). The fix is trivial
> in both cases - basically all that's needed at the end of both functions
> is this:
>
> "Filter out values out of range for the signed interpretation such as
> 16rFFFFFFFF (positive w/ bit 32 set) and -16rFFFFFFFF (negative w/ bit
> 32 set). Since the sign is implicit in the class we require that the
> high bit of the magnitude is not set which is a simple test here"
> value < 0 ifTrue:[^self primitiveFail].
> negative
> ifTrue:[^0 - value]
> ifFalse:[^value]
>
This C weak types always a place of uncertainty for me.
What i fear of, that if you change implementation of
#signed32BitValueOf: it can break more things than it was before. Due
to same reasons, of course.
> Cheers,
>
> - Andreas
>
--
Best regards,
Igor Stasenko AKA sig.
More information about the Vm-dev
mailing list