From 8cd95cec0f5bde4d78dd26778f6070b3bdda6672 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Fri, 20 Apr 2018 23:43:51 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++ gcc/gimple-fold.c | 12 +++++++-- gcc/gimple-ssa-warn-restrict.c | 19 +++++++++++---- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/Wrestrict-15.c | 38 +++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wrestrict-15.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b58362d2174..750958465f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-04-20 Martin Sebor + + 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 PR target/85456 diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 7771988b837..bd8c44a6a60 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -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); diff --git a/gcc/gimple-ssa-warn-restrict.c b/gcc/gimple-ssa-warn-restrict.c index e7a85fdcd13..3d0664da028 100644 --- a/gcc/gimple-ssa-warn-restrict.c +++ b/gcc/gimple-ssa-warn-restrict.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5314d9e14b4..947b974cab1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-20 Martin Sebor + + PR c/85365 + * gcc.dg/Wrestrict-15.c: New test. + 2018-04-20 Michael Meissner PR target/85456 diff --git a/gcc/testsuite/gcc.dg/Wrestrict-15.c b/gcc/testsuite/gcc.dg/Wrestrict-15.c new file mode 100644 index 00000000000..b0b30a2baec --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wrestrict-15.c @@ -0,0 +1,38 @@ +/* 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); +} -- 2.30.2