diff mbox

Fix UB in tree-ssa-structalias.c

Message ID 20170619174603.GX2123@tucnak
State New
Headers show

Commit Message

Jakub Jelinek June 19, 2017, 5:46 p.m. UTC
Hi!

Another easy to fix bug reported by bootstrap-ubsan.
We check that rhsunitoffset fits into shwi, but even if it does,
8x that might not, in which case we trigger UB.
Fixed by doing the multiplication in unsigned HWI type to make it well
defined.

Bootstrapped/regtested on x86_64-linux and i686-linux (both normal
and bootstrap-ubsan), ok for trunk?

2017-06-19  Jakub Jelinek  <jakub@redhat.com>

	* tree-ssa-structalias.c (get_constraint_for_ptr_offset): Multiply
	in UWHI to avoid undefined overflow.


	Jakub

Comments

Richard Biener June 19, 2017, 5:51 p.m. UTC | #1
On June 19, 2017 7:46:03 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>Another easy to fix bug reported by bootstrap-ubsan.
>We check that rhsunitoffset fits into shwi, but even if it does,
>8x that might not, in which case we trigger UB.
>Fixed by doing the multiplication in unsigned HWI type to make it well
>defined.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux (both normal
>and bootstrap-ubsan), ok for trunk?

OK.

Richard.

>2017-06-19  Jakub Jelinek  <jakub@redhat.com>
>
>	* tree-ssa-structalias.c (get_constraint_for_ptr_offset): Multiply
>	in UWHI to avoid undefined overflow.
>
>--- gcc/tree-ssa-structalias.c.jj	2017-05-24 11:59:06.000000000 +0200
>+++ gcc/tree-ssa-structalias.c	2017-06-19 14:10:50.989594911 +0200
>@@ -3087,7 +3087,7 @@ get_constraint_for_ptr_offset (tree ptr,
> 	{
> 	  /* Make sure the bit-offset also fits.  */
> 	  HOST_WIDE_INT rhsunitoffset = soffset.to_shwi ();
>-	  rhsoffset = rhsunitoffset * BITS_PER_UNIT;
>+	  rhsoffset = rhsunitoffset * (unsigned HOST_WIDE_INT) BITS_PER_UNIT;
> 	  if (rhsunitoffset != rhsoffset / BITS_PER_UNIT)
> 	    rhsoffset = UNKNOWN_OFFSET;
> 	}
>
>	Jakub
diff mbox

Patch

--- gcc/tree-ssa-structalias.c.jj	2017-05-24 11:59:06.000000000 +0200
+++ gcc/tree-ssa-structalias.c	2017-06-19 14:10:50.989594911 +0200
@@ -3087,7 +3087,7 @@  get_constraint_for_ptr_offset (tree ptr,
 	{
 	  /* Make sure the bit-offset also fits.  */
 	  HOST_WIDE_INT rhsunitoffset = soffset.to_shwi ();
-	  rhsoffset = rhsunitoffset * BITS_PER_UNIT;
+	  rhsoffset = rhsunitoffset * (unsigned HOST_WIDE_INT) BITS_PER_UNIT;
 	  if (rhsunitoffset != rhsoffset / BITS_PER_UNIT)
 	    rhsoffset = UNKNOWN_OFFSET;
 	}