This repository was archived by the owner on May 21, 2019. It is now read-only.
Remove UB from int-to-float conversion for INT_MIN. #24
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The fixed->float conversion intrinsics were carefully written to handle the case where the input is
INT_MIN
; e.g. avoiding sign extension via an intermediate cast to an unsigned int.Unfortunately it wasn't quite careful enough; I am seeing evidence in rust-lang/rust#36518 that one cannot rely on
-a
to behave in the same manner as~(unsigned)a+1
, because it is simply undefined behavior.INT_MIN
here: http://stackoverflow.com/questions/37301078/is-negating-int-min-undefined-behaviourAnyway, the fix I've chosen is simple enough: cast to
unsigned int
earlier in the computation and use~a + 1
to do the negation.