Commit 8cd95cec by Martin Sebor Committed by Martin Sebor

PR c/85365 - -Wrestrict false positives with -fsanitize=undefined

gcc/ChangeLog:

	PR c/85365
	* gimple-fold.c (gimple_fold_builtin_strcpy): Suppress -Wrestrict
	for null pointers.
	(gimple_fold_builtin_stxcpy_chk): Same.
	* gimple-ssa-warn-restrict.c (check_bounds_or_overlap): Same.

gcc/testsuite/ChangeLog:

	PR c/85365
	* gcc.dg/Wrestrict-15.c: New test.

From-SVN: r259535
parent 661eb8f9
2018-04-20 Martin Sebor <msebor@redhat.com>
PR c/85365
* gimple-fold.c (gimple_fold_builtin_strcpy): Suppress -Wrestrict
for null pointers.
(gimple_fold_builtin_stxcpy_chk): Same.
* gimple-ssa-warn-restrict.c (check_bounds_or_overlap): Same.
2018-04-20 Michael Meissner <meissner@linux.ibm.com>
PR target/85456
......
......@@ -1612,7 +1612,11 @@ gimple_fold_builtin_strcpy (gimple_stmt_iterator *gsi,
/* If SRC and DEST are the same (and not volatile), return DEST. */
if (operand_equal_p (src, dest, 0))
{
if (!gimple_no_warning_p (stmt))
/* Issue -Wrestrict unless the pointers are null (those do
not point to objects and so do not indicate an overlap;
such calls could be the result of sanitization and jump
threading). */
if (!integer_zerop (dest) && !gimple_no_warning_p (stmt))
{
tree func = gimple_call_fndecl (stmt);
......@@ -2593,7 +2597,11 @@ gimple_fold_builtin_stxcpy_chk (gimple_stmt_iterator *gsi,
/* If SRC and DEST are the same (and not volatile), return DEST. */
if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
{
if (!gimple_no_warning_p (stmt))
/* Issue -Wrestrict unless the pointers are null (those do
not point to objects and so do not indicate an overlap;
such calls could be the result of sanitization and jump
threading). */
if (!integer_zerop (dest) && !gimple_no_warning_p (stmt))
{
tree func = gimple_call_fndecl (stmt);
......
......@@ -1880,11 +1880,20 @@ check_bounds_or_overlap (gcall *call, tree dst, tree src, tree dstsize,
if (operand_equal_p (dst, src, 0))
{
warning_at (loc, OPT_Wrestrict,
"%G%qD source argument is the same as destination",
call, func);
gimple_set_no_warning (call, true);
return false;
/* Issue -Wrestrict unless the pointers are null (those do
not point to objects and so do not indicate an overlap;
such calls could be the result of sanitization and jump
threading). */
if (!integer_zerop (dst) && !gimple_no_warning_p (call))
{
warning_at (loc, OPT_Wrestrict,
"%G%qD source argument is the same as destination",
call, func);
gimple_set_no_warning (call, true);
return false;
}
return true;
}
/* Return false when overlap has been detected. */
......
2018-04-20 Martin Sebor <msebor@redhat.com>
PR c/85365
* gcc.dg/Wrestrict-15.c: New test.
2018-04-20 Michael Meissner <meissner@linux.ibm.com>
PR target/85456
......
/* PR 85365 - -Wrestrict false positives with -fsanitize=undefined
{ dg-do compile }
{ dg-options "-O2 -Wrestrict -fsanitize=undefined" } */
typedef __SIZE_TYPE__ size_t;
char *strcpy (char *, const char *);
char *strcat (char *, const char *);
size_t strlen (char *);
extern char a[], b[], d[];
size_t t1 (char *g, int i)
{
/* The following exercises the handling in gimple-fold.c. */
strcpy (g + 4, i ? b : a); /* { dg-bogus "\\\[-Wrestrict]" } */
return strlen (g + 4);
}
void t2 (char *g, int i)
{
strcpy (g + 4, i ? b : a); /* { dg-bogus "\\\[-Wrestrict]" } */
strcat (g + 4, d);
}
void t3 (char *g, int i)
{
/* The following exercises the handling in gimple-ssa-warn-restrict.c. */
strcat (g + 4, i ? b : a); /* { dg-bogus "\\\[-Wrestrict]" } */
strcat (g + 4, d);
}
void t4 (char *p, char *q)
{
strcpy (p, q); /* { dg-bogus "\\\[-Wrestrict]" } */
strcat (p, q + 32);
}
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