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