PR c/88065 - ICE in -Wsizeof-pointer-memaccess on an invalid strncpy
authorMartin Sebor <msebor@redhat.com>
Wed, 28 Nov 2018 23:04:09 +0000 (23:04 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 28 Nov 2018 23:04:09 +0000 (16:04 -0700)
PR c/88065 - ICE in -Wsizeof-pointer-memaccess on an invalid strncpy
PR c/87297 - ICE on strncpy with an undeclared argument

gcc/c-family/ChangeLog:

PR c/88065
PR c/87297
* c-warn.c (sizeof_pointer_memaccess_warning): Bail if source
or destination is an error.

gcc/testsuite/ChangeLog:

PR c/88065
PR c/87297
* c-c++-common/Wsizeof-pointer-memaccess4.c: New test.

From-SVN: r266594

gcc/c-family/ChangeLog
gcc/c-family/c-warn.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wsizeof-pointer-memaccess4.c [new file with mode: 0644]

index bc85a93447b5eb25f4d8b33133b8e88145313c4d..ee193d950817dd57a11183b3e5d8f46358e8d19f 100644 (file)
@@ -1,3 +1,10 @@
+2018-11-28  Martin Sebor  <msebor@redhat.com>
+
+       PR c/88065
+       PR c/87297
+       * c-warn.c (sizeof_pointer_memaccess_warning): Bail if source
+       or destination is an error.
+
 2018-11-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/88215
index 93c343a438428075b336435ba43f4b7517c9ca37..798ad1bcb399fd30969d879bc2247305bc156797 100644 (file)
@@ -784,7 +784,12 @@ sizeof_pointer_memaccess_warning (location_t *sizeof_arg_loc, tree callee,
   if (idx >= 3)
     return;
 
-  if (sizeof_arg[idx] == NULL || sizeof_arg[idx] == error_mark_node)
+  /* Use error_operand_p to detect non-error arguments with an error
+     type that the C++ front-end constructs.  */
+  if (error_operand_p (src)
+      || error_operand_p (dest)
+      || !sizeof_arg[idx]
+      || error_operand_p (sizeof_arg[idx]))
     return;
 
   type = TYPE_P (sizeof_arg[idx])
index 0ba033a08ae9eba3c18f27aefe281262e678fd25..07b8e8447d90c0e12e38a98215536689fd58f083 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-28  Martin Sebor  <msebor@redhat.com>
+
+       PR c/88065
+       PR c/87297
+       * c-c++-common/Wsizeof-pointer-memaccess4.c: New test.
+
 2018-11-28  Marek Polacek  <polacek@redhat.com>
 
        Implement P1094R2, Nested inline namespaces.
diff --git a/gcc/testsuite/c-c++-common/Wsizeof-pointer-memaccess4.c b/gcc/testsuite/c-c++-common/Wsizeof-pointer-memaccess4.c
new file mode 100644 (file)
index 0000000..b2052f3
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR c/88065 - ICE in -Wsizeof-pointer-memaccess on an invalid strncpy
+   PR c/87297 - ICE on strncpy with an undeclared argument
+   { dg-do compile }
+   { dg-options "-Wall -Wsizeof-pointer-memaccess" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+char* strncpy (char*, const char*, size_t);
+
+struct A { char a[4], b[6]; };
+
+void test_invalid_dst (struct A *p)
+{
+  strncpy (q->a, p->b, sizeof p->b);    /* { dg-error ".q. undeclared|not declared" } */
+}
+
+void test_invalid_src (struct A *p)
+{
+  strncpy (p->a, q->b, sizeof p->b);    /* { dg-error ".q. undeclared|not declared" } */
+}
+
+void test_invalid_bound (struct A *p)
+{
+  strncpy (p->a, p->b, sizeof q->b);    /* { dg-error ".q. undeclared|not declared" } */
+}
+
+/* Verify the C++ front end doesn't ICE (the verifies that the fix
+   for PR c/87297 uses error_operand_p to detect the invalid source
+   argument rather than just checking its equality to error_mark_node.  */
+struct B { char a[4]; };
+
+void test_cxx_invalid_dst (struct B *p, const char *s)
+{
+  struct T x;                          /* { dg-error "storage size|incomplete type|unused" } */
+  __builtin_strncpy (x, s, sizeof p->a);
+}