aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2018-04-20 23:43:51 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2018-04-20 17:43:51 -0600
commit8cd95cec0f5bde4d78dd26778f6070b3bdda6672 (patch)
treee2c3ae88ecc8a5de23f062a8f185c0f70860ae17
parent661eb8f9e5270df79c21601273219e2a8e282204 (diff)
downloadgcc-8cd95cec0f5bde4d78dd26778f6070b3bdda6672.zip
gcc-8cd95cec0f5bde4d78dd26778f6070b3bdda6672.tar.gz
gcc-8cd95cec0f5bde4d78dd26778f6070b3bdda6672.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimple-fold.c12
-rw-r--r--gcc/gimple-ssa-warn-restrict.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/Wrestrict-15.c38
5 files changed, 75 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b58362d..7509584 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 7771988..bd8c44a 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 e7a85fd..3d0664d 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 5314d9e..947b974 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/Wrestrict-15.c b/gcc/testsuite/gcc.dg/Wrestrict-15.c
new file mode 100644
index 0000000..b0b30a2
--- /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);
+}