PR tree-optimization/82596 - missing -Warray-bounds on an out-of-bounds

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
This commit is contained in:
Martin Sebor 2017-10-19 16:03:07 +00:00 committed by Martin Sebor
parent 9e878cf1ba
commit f5ba8fd108
4 changed files with 40 additions and 0 deletions

View 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.

View 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.

View file

@ -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" } */
}

View 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