On 18 December 2015 at 04:05, Gao, Liming <[email protected]> wrote: > Reviewed-by: Liming Gao <[email protected]> >
Thanks. Committed as SVN r19580 > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: Thursday, December 17, 2015 6:01 PM > To: [email protected]; Gao, Liming > Cc: Ard Biesheuvel > Subject: [PATCH 1/8] 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 × 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 × 2^E2 is representable in the result type, then that is the resulting > value; otherwise, the behavior is undefined. > > 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]> > --- > MdePkg/Library/BaseLib/Math64.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/MdePkg/Library/BaseLib/Math64.c > b/MdePkg/Library/BaseLib/Math64.c index 83d76847213e..9624cf90029f 100644 > --- a/MdePkg/Library/BaseLib/Math64.c > +++ b/MdePkg/Library/BaseLib/Math64.c > @@ -86,7 +86,7 @@ InternalMathARShiftU64 ( > // > // 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 > -- > 2.5.0 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

