diff mbox

Fix signed integer overflow in gcc/data-streamer.c

Message ID 20140928122218.GA302@x4
State New
Headers show

Commit Message

Markus Trippelsdorf Sept. 28, 2014, 12:22 p.m. UTC
Running the testsuite with a -fsanitize=undefined instrumented compiler
shows:
 % gcc -O2 -flto -fno-use-linker-plugin -flto-partition=none testsuite/gcc.dg/torture/pr28045.c
gcc/data-streamer.c:113:45: runtime error: negation of -9223372036854775808 cannot be represented in type 'long int'; cast to an unsigned type to negate this value to itself

The fix is obvious.

Boostrapped and tested on x86_64-unknown-linux-gnu.
OK for trunk?
Thanks.

2014-09-28  Markus Trippelsdorf  <markus@trippelsdorf.de>

	* data-streamer.c (bp_unpack_var_len_int): Avoid signed
	integer overflow.

Comments

Steven Bosscher Sept. 28, 2014, 12:36 p.m. UTC | #1
On Sun, Sep 28, 2014 at 2:22 PM, Markus Trippelsdorf wrote:
> Running the testsuite with a -fsanitize=undefined instrumented compiler
> shows:
>  % gcc -O2 -flto -fno-use-linker-plugin -flto-partition=none testsuite/gcc.dg/torture/pr28045.c
> gcc/data-streamer.c:113:45: runtime error: negation of -9223372036854775808 cannot be represented in type 'long int'; cast to an unsigned type to negate this value to itself
>
> The fix is obvious.
>
> Boostrapped and tested on x86_64-unknown-linux-gnu.
> OK for trunk?
> Thanks.
>
> 2014-09-28  Markus Trippelsdorf  <markus@trippelsdorf.de>
>
>         * data-streamer.c (bp_unpack_var_len_int): Avoid signed
>         integer overflow.
>
> diff --git a/gcc/data-streamer.c b/gcc/data-streamer.c
> index 0e19c72162aa..0760ed590c22 100644
> --- a/gcc/data-streamer.c
> +++ b/gcc/data-streamer.c
> @@ -110,7 +110,7 @@ bp_unpack_var_len_int (struct bitpack_d *bp)
>        if ((half_byte & 0x8) == 0)
>         {
>           if ((shift < HOST_BITS_PER_WIDE_INT) && (half_byte & 0x4))
> -           result |= - ((HOST_WIDE_INT)1 << shift);
> +           result |= - ((unsigned HOST_WIDE_INT)1 << shift);
>
>           return result;
>         }


Can you use HOST_WIDE_INT_1U for this?

Ciao!
Steven
diff mbox

Patch

diff --git a/gcc/data-streamer.c b/gcc/data-streamer.c
index 0e19c72162aa..0760ed590c22 100644
--- a/gcc/data-streamer.c
+++ b/gcc/data-streamer.c
@@ -110,7 +110,7 @@  bp_unpack_var_len_int (struct bitpack_d *bp)
       if ((half_byte & 0x8) == 0)
 	{
 	  if ((shift < HOST_BITS_PER_WIDE_INT) && (half_byte & 0x4))
-	    result |= - ((HOST_WIDE_INT)1 << shift);
+	    result |= - ((unsigned HOST_WIDE_INT)1 << shift);
 
 	  return result;
 	}