On August 14, 2015 5:27:15 PM GMT+02:00, Marek Polacek <pola...@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  <pola...@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


Reply via email to