PR tree-optimization/82596 - missing -Warray-bounds on an out-of-bounds
authorMartin Sebor <msebor@redhat.com>
Thu, 19 Oct 2017 16:03:07 +0000 (16:03 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Thu, 19 Oct 2017 16:03:07 +0000 (10:03 -0600)
PR tree-optimization/82596 - missing -Warray-bounds on an out-of-bounds
  index into string literal

gcc/ChangeLog:
* tree.c (array_at_struct_end_p): Handle STRING_CST.

gcc/testsuite/ChangeLog:
* gcc/testsuite/gcc.dg/pr82596.c: New test.

From-SVN: r253902

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr82596.c [new file with mode: 0644]
gcc/tree.c

index c63d73424a73343e228a795748e87664ed33aed1..43c928b93944f57db4434de07426e73dfb277dc4 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-19  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/82596
+       * tree.c (array_at_struct_end_p): Handle STRING_CST.
+
 2017-10-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * asan.c (handle_builtin_alloca): Deal with all alloca variants.
index 138899afb8211ec8ddf81aa9e0b706b6a9bb8f36..31cf70bbfcb425afb21276d01fac8507e64fcd48 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-19  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/82596
+       * gcc/testsuite/gcc.dg/pr82596.c: New test.
+
 2017-10-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/Walloca-15.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr82596.c b/gcc/testsuite/gcc.dg/pr82596.c
new file mode 100644 (file)
index 0000000..5dc67c2
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR tree-optimization/82596 - missing -Warray-bounds on an out-of-bounds
+   index into string literal
+   { dg-do compile }
+   { dg-options "-O2 -Warray-bounds" } */
+
+#define SIZE_MAX  __SIZE_MAX__
+#define SSIZE_MAX __PTRDIFF_MAX__
+#define SSIZE_MIN (-SSIZE_MAX - 1)
+
+void sink (int, ...);
+
+#define T(arg) sink (arg)
+
+void test_cststring (int i)
+{
+  T (""[SSIZE_MIN]);                      /* { dg-warning "below array bounds" "string" { xfail lp64 } } */
+  T (""[SSIZE_MIN + 1]);                  /* { dg-warning "below array bounds" "string" } */
+  T (""[-1]);                             /* { dg-warning "below array bounds" "string" } */
+  T (""[0]);
+  T (""[1]);                              /* { dg-warning "above array bounds" "string" } */
+  T ("0"[2]);                             /* { dg-warning "above array bounds" "string" } */
+  T ("012"[2]);
+  T ("012"[3]);
+  T ("012"[4]);                           /* { dg-warning "above array bounds" "string" } */
+  T ("0123"[SSIZE_MAX]);                  /* { dg-warning "above array bounds" "string" } */
+  T ("0123"[SIZE_MAX]);                   /* { dg-warning "above array bounds" "string" } */
+}
index 1b20ad6e9e8aeb25dc939227e8dee6fcaa99636f..62a438609af9e689988316f666bb360def7f5d4e 100644 (file)
@@ -12549,6 +12549,9 @@ array_at_struct_end_p (tree ref)
   else
     return false;
 
+  if (TREE_CODE (ref) == STRING_CST)
+    return false;
+
   while (handled_component_p (ref))
     {
       /* If the reference chain contains a component reference to a