Commit 21150aba by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/86614 (duplicate -Warray-bounds for a strncpy call with…

re PR tree-optimization/86614 (duplicate -Warray-bounds for a strncpy  call with out-of-bounds offset)

	PR tree-optimization/86614
	* gimple-ssa-warn-restrict.c (maybe_diag_offset_bounds): Return early
	if TREE_NO_WARNING is set on ref.ref.

	* c-c++-common/Warray-bounds-2.c (wrap_strncpy_dstarray_diff_neg,
	call_strncpy_dstarray_diff_neg): Don't expect late -Warray-bounds
	warnings, just early ones from FE.  Remove dg-prune-output.
	* c-c++-common/Warray-bounds-6.c: New test.

From-SVN: r266403
parent e0a35f9b
2018-11-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/86614
* gimple-ssa-warn-restrict.c (maybe_diag_offset_bounds): Return early
if TREE_NO_WARNING is set on ref.ref.
2018-11-22 Sandra Loosemore <sandra@codesourcery.com>
Alan Coopersmith <alan.coopersmith@oracle.com>
......@@ -1582,6 +1582,9 @@ maybe_diag_offset_bounds (location_t loc, gimple *call, tree func, int strict,
if (!warn_array_bounds)
return false;
if (ref.ref && TREE_NO_WARNING (ref.ref))
return false;
offset_int ooboff[] = { ref.offrange[0], ref.offrange[1] };
tree oobref = ref.offset_out_of_bounds (strict, ooboff);
if (!oobref)
......
2018-11-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/86614
* c-c++-common/Warray-bounds-2.c (wrap_strncpy_dstarray_diff_neg,
call_strncpy_dstarray_diff_neg): Don't expect late -Warray-bounds
warnings, just early ones from FE. Remove dg-prune-output.
* c-c++-common/Warray-bounds-6.c: New test.
* gfortran.dg/pad_source_1.f: New test.
* gfortran.dg/pad_source_2.f: New test.
* gfortran.dg/pad_source_3.f: New test.
......
......@@ -201,18 +201,16 @@ void call_strncpy_dst_diff_max (const char *s, size_t n)
static void
wrap_strncpy_dstarray_diff_neg (char *d, const char *s, ptrdiff_t i, size_t n)
{
strncpy (d + i, s, n); /* { dg-warning "offset -\[0-9\]+ is out of the bounds \\\[0, 90] of object .ar10. with type .(struct )?Array ?\\\[2]." "strncpy" } */
}
strncpy (d + i, s, n); /* { dg-bogus "offset -\[0-9\]+ is out of the bounds \\\[0, 90] of object .ar10. with type .(struct )?Array ?\\\[2]." "strncpy" } */
} /* { dg-warning "array subscript -1 is outside array bounds" "" { target *-*-* } .-1 } */
void call_strncpy_dstarray_diff_neg (const char *s, size_t n)
{
struct Array ar10[2]; /* { dg-message ".ar10. declared here" } */
sink (&ar10);
struct Array ar10[2]; /* { dg-bogus ".ar10. declared here" } */
sink (&ar10); /* { dg-message "while referencing" "" { target *-*-* } .-1 } */
int off = (char*)ar10[1].a17 - (char*)ar10 + 1;
wrap_strncpy_dstarray_diff_neg (ar10[1].a17, s, -off, n);
sink (&ar10);
}
/* { dg-prune-output "outside array bounds" } */
/* PR tree-optimization/86614 */
/* { dg-do compile } */
/* { dg-options "-O2 -Warray-bounds" } */
extern char *strncpy (char *, const char *, __SIZE_TYPE__);
void sink (void *);
struct A { char b[17]; } a[2];
void g (const char *s, unsigned n)
{
int i = (char *)a[1].b - (char *)a + 1;
char *d = a[1].b;
/* Ensure the same bug is not diagnosed more than once. */
strncpy (d + i, s, n); /* { dg-warning "array subscript \[0-9]+ is outside array bounds of" } */
/* { dg-bogus "offset \[0-9]+ is out of the bounds \\\[0, \[0-9]+\\\] of object 'a' with type" "" { target *-*-* } .-1 } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment