Message ID | 20150814152715.GT3335@redhat.com |
---|---|
State | New |
Headers | show |
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 --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); +}