diff mbox

Fix middle-end/67133, part 2

Message ID 20150814152715.GT3335@redhat.com
State New
Headers show

Commit Message

Marek Polacek Aug. 14, 2015, 3:27 p.m. UTC
This is the second fix for this PR.  Here the problem was that we were
accessing arguments that don't exist.  We first need to check that the
call stmt has sufficient number of arguments.  For details see the PR.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2015-08-14  Marek Polacek  <polacek@redhat.com>

	PR middle-end/67133
	* gimple.c (infer_nonnull_range_by_attribute): Check that the
	nonnull argument position is not outside function arguments.

	* gcc.dg/torture/pr67133.c: New test.


	Marek

Comments

Richard Biener Aug. 14, 2015, 4:24 p.m. UTC | #1
On August 14, 2015 5:27:15 PM GMT+02:00, Marek Polacek <polacek@redhat.com> wrote:
>This is the second fix for this PR.  Here the problem was that we were
>accessing arguments that don't exist.  We first need to check that the
>call stmt has sufficient number of arguments.  For details see the PR.
>
>Bootstrapped/regtested on x86_64-linux, ok for trunk?

OK.

Thanks,
Richard.

>2015-08-14  Marek Polacek  <polacek@redhat.com>
>
>	PR middle-end/67133
>	* gimple.c (infer_nonnull_range_by_attribute): Check that the
>	nonnull argument position is not outside function arguments.
>
>	* gcc.dg/torture/pr67133.c: New test.
>
>diff --git gcc/gimple.c gcc/gimple.c
>index cca328a..1bfa8c7 100644
>--- gcc/gimple.c
>+++ gcc/gimple.c
>@@ -2694,10 +2694,13 @@ infer_nonnull_range_by_attribute (gimple stmt,
>tree op)
> 	  /* Now see if op appears in the nonnull list.  */
> 	  for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
> 	    {
>-	      int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
>-	      tree arg = gimple_call_arg (stmt, idx);
>-	      if (operand_equal_p (op, arg, 0))
>-		return true;
>+	      unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
>+	      if (idx < gimple_call_num_args (stmt))
>+		{
>+		  tree arg = gimple_call_arg (stmt, idx);
>+		  if (operand_equal_p (op, arg, 0))
>+		    return true;
>+		}
> 	    }
> 	}
>     }
>diff --git gcc/testsuite/gcc.dg/torture/pr67133.c
>gcc/testsuite/gcc.dg/torture/pr67133.c
>index e69de29..4eb552e 100644
>--- gcc/testsuite/gcc.dg/torture/pr67133.c
>+++ gcc/testsuite/gcc.dg/torture/pr67133.c
>@@ -0,0 +1,34 @@
>+/* { dg-do compile } */
>+/* { dg-additional-options "-fisolate-erroneous-paths-attribute" } */
>+
>+int printf (const char *, ...);
>+int foo (int);
>+
>+int a, *b, c;
>+
>+static int
>+fn1 ()
>+{ 
>+  if (a)
>+    return (a = 0);
>+  for (; a; )
>+    a = 0;
>+  return 0;
>+}
>+
>+static int
>+fn2 (int p)
>+{ 
>+  fn1 ();
>+  c = 0;
>+  if (p)
>+    printf ("%d", 0);
>+  foo (b != &p);
>+  return 0;
>+}
>+
>+void
>+fn3 ()
>+{ 
>+  fn2 (0);
>+}
>
>	Marek
diff mbox

Patch

diff --git gcc/gimple.c gcc/gimple.c
index cca328a..1bfa8c7 100644
--- gcc/gimple.c
+++ gcc/gimple.c
@@ -2694,10 +2694,13 @@  infer_nonnull_range_by_attribute (gimple stmt, tree op)
 	  /* Now see if op appears in the nonnull list.  */
 	  for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
 	    {
-	      int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
-	      tree arg = gimple_call_arg (stmt, idx);
-	      if (operand_equal_p (op, arg, 0))
-		return true;
+	      unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
+	      if (idx < gimple_call_num_args (stmt))
+		{
+		  tree arg = gimple_call_arg (stmt, idx);
+		  if (operand_equal_p (op, arg, 0))
+		    return true;
+		}
 	    }
 	}
     }
diff --git gcc/testsuite/gcc.dg/torture/pr67133.c gcc/testsuite/gcc.dg/torture/pr67133.c
index e69de29..4eb552e 100644
--- gcc/testsuite/gcc.dg/torture/pr67133.c
+++ gcc/testsuite/gcc.dg/torture/pr67133.c
@@ -0,0 +1,34 @@ 
+/* { dg-do compile } */
+/* { dg-additional-options "-fisolate-erroneous-paths-attribute" } */
+
+int printf (const char *, ...);
+int foo (int);
+
+int a, *b, c;
+
+static int
+fn1 ()
+{ 
+  if (a)
+    return (a = 0);
+  for (; a; )
+    a = 0;
+  return 0;
+}
+
+static int
+fn2 (int p)
+{ 
+  fn1 ();
+  c = 0;
+  if (p)
+    printf ("%d", 0);
+  foo (b != &p);
+  return 0;
+}
+
+void
+fn3 ()
+{ 
+  fn2 (0);
+}