Revision: 19580
http://sourceforge.net/p/edk2/code/19580
Author: abiesheuvel
Date: 2015-12-31 10:47:22 +0000 (Thu, 31 Dec 2015)
Log Message:
-----------
MdePkg/BaseLib: do not rely on undefined behavior in arithmetic shift
The runtime test whether the compiler supports arithmetic shift of
negative signed numbers currently relies on undefined behavior in C,
which means that all bets are off regarding whether the condition
that follows passes or fails, regardless of whether the compiler in
fact supports arithmetic shift or not.
Relevant quote from ISO C99 (6.5.7/4)
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits
are filled with zeros. If E1 has an unsigned type, the value of the result
is E1 ?\195?\151 2^E2, reduced modulo one more than the maximum value
representable
in the result type. If E1 has a signed type and nonnegative value, and
E1 ?\195?\151 2^E2 is representable in the result type, then that is the
resulting
value; otherwise, the behavior is unde?\239?\172?\129ned.
For historic purposes, let's keep the test in place (although it is doubtful
we actually need it) but rewrite it in a way that prevents compilers from
this century from doing whacky things with it.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Liming Gao <[email protected]>
Modified Paths:
--------------
trunk/edk2/MdePkg/Library/BaseLib/Math64.c
Modified: trunk/edk2/MdePkg/Library/BaseLib/Math64.c
===================================================================
--- trunk/edk2/MdePkg/Library/BaseLib/Math64.c 2015-12-30 08:10:55 UTC (rev
19579)
+++ trunk/edk2/MdePkg/Library/BaseLib/Math64.c 2015-12-31 10:47:22 UTC (rev
19580)
@@ -86,7 +86,7 @@
//
// Test if this compiler supports arithmetic shift
//
- TestValue = (((-1) << (sizeof (-1) * 8 - 1)) >> (sizeof (-1) * 8 - 1));
+ TestValue = (INTN)((INT64)(1ULL << 63) >> 63);
if (TestValue == -1) {
//
// Arithmetic shift is supported
------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits