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

Reply via email to