PR 87756 - missing unterminated argument warning using address of a constant character
authorMartin Sebor <msebor@gcc.gnu.org>
Mon, 26 Nov 2018 23:55:36 +0000 (16:55 -0700)
committerMartin Sebor <msebor@gcc.gnu.org>
Mon, 26 Nov 2018 23:55:36 +0000 (16:55 -0700)
gcc/ChangeLog:

PR 87756
* expr.c (string_constant): Handle top-level decls of all character
types and subobjects of narrow character type.

gcc/testsuite/ChangeLog:

        PR 87756
* gcc.dg/warn-sprintf-no-nul-2.c: Move incomplete tests from here...
* gcc.dg/warn-sprintf-no-nul-3.c: ...to here and complete them.

From-SVN: r266494

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/warn-sprintf-no-nul-2.c
gcc/testsuite/gcc.dg/warn-sprintf-no-nul-3.c [new file with mode: 0644]

index 19a802c6c7200725b6733452326e06ae5e893b65..828dc23c21bb466ac798795c3480d30cb4f01932 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-26  Martin Sebor  <msebor@redhat.com>
+
+       PR 87756
+       * expr.c (string_constant): Handle top-level decls of all character
+       types and subobjects of narrow character type.
+
 2018-11-27  Alan Modra  <amodra@gmail.com>
 
        * config.gcc (powerpc*-*-linux*): Add linux.h to tm_file.
index 021a04c5944e92557c09764211ea66da8e6ccd37..ef29ec5c40aa88ef1c710c7327fad145e1451dd3 100644 (file)
@@ -11497,10 +11497,16 @@ string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl)
   if (decl)
     *decl = array;
 
-  if (TREE_CODE (init) == INTEGER_CST)
+  if (TREE_CODE (init) == INTEGER_CST
+      && (TREE_CODE (TREE_TYPE (array)) == INTEGER_TYPE
+         || TYPE_MAIN_VARIANT (eltype) == char_type_node))
     {
       /* For a reference to (address of) a single constant character,
-        store the native representation of the character in CHARBUF.   */
+        store the native representation of the character in CHARBUF.
+        If the reference is to an element of an array or a member
+        of a struct, only consider narrow characters until ctors
+        for wide character arrays are transformed to STRING_CSTs
+        like those for narrow arrays.  */
       unsigned char charbuf[MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT];
       int len = native_encode_expr (init, charbuf, sizeof charbuf, 0);
       if (len > 0)
index 989b548276e4fca3ebd872da78e382c15674e9b6..34790af21677fa42ac44213b57385768bc59b750 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-26  Martin Sebor  <msebor@redhat.com>
+
+       PR 87756
+       * gcc.dg/warn-sprintf-no-nul-2.c: Move incomplete tests from here...
+       * gcc.dg/warn-sprintf-no-nul-3.c: ...to here and complete them.
+
 2018-11-26  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88120 - ICE when calling save_expr in a template.
@@ -26,7 +32,7 @@
 
 2018-11-26  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
-       * lib/target-supports.exp (check_effective_target_newlib_nano_io): New. 
+       * lib/target-supports.exp (check_effective_target_newlib_nano_io): New.
        * gcc.c-torture/execute/920501-8.c: Register undefined linker symbol
        _printf_float for newlib_nano_io target.
        * gcc.c-torture/execute/930513-1.c: Likewise.
@@ -70,7 +76,7 @@
        * gcc.dg/tree-ssa/loop-interchange-1.c: Likewise.
        * gcc.dg/tree-ssa/loop-interchange-1b.c: Likewise.
        * lib/target-supports.exp (check_effective_target_size20plus): New.
-       (check_effective_target_size32plus): Update comment. 
+       (check_effective_target_size32plus): Update comment.
 
 2018-11-26  Uros Bizjak  <ubizjak@gmail.com>
 
index d3d776c03a897e6461fd25cc66eeb342278d02a7..3372a8b99ecba07f1765ea182f5b2ecbd88f0dc6 100644 (file)
@@ -3,9 +3,6 @@
    { dg-do compile }
    { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
 
-typedef __SIZE_TYPE__ size_t;
-typedef __WCHAR_TYPE__ wchar_t;
-
 int sprintf (char*, const char*, ...);
 
 extern char* dest (void);
@@ -71,61 +68,3 @@ void test_sprintf_s (void)
   T (sprintf (D, "%s", &str3[3]));
   T (sprintf (D, "%s", &str3[4]));      /* { dg-warning "\\\[-Warray-bounds" } */
 }
-
-
-const char wnul = '\0';
-const char wnonul = 'a';
-const char wcs3[] = "123";
-
-const struct
-{
-  char a, b, s[3];
-} w1 = { '\0', 'b', "123" },
-  w2[2] = {
-  { '\0', 'c', "12" },
-  { 'd', '\0', "123" }
-  };
-
-void test_sprintf_ls (void)
-{
-  T (sprintf (D, "%s", &wnul));
-  T (sprintf (D, "%s", &wnonul));       /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.1s", &wnonul));
-  T (sprintf (D, "%.2s", &wnonul));     /* { dg-warning "nul-terminated" } */
-
-  T (sprintf (D, "%s", &w1.a));
-  T (sprintf (D, "%s", &w1.b));         /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.1s", &w1.b));
-  T (sprintf (D, "%.2s", &w1.b));       /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%s", w1.s));          /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.3s", w1.s));
-  T (sprintf (D, "%.4s", w1.s));        /* { dg-warning "nul-terminated" } */
-
-  T (sprintf (D, "%.2s", w1.s + 1));
-  T (sprintf (D, "%.3s", w1.s + 1));    /* { dg-warning "nul-terminated" } */
-
-  T (sprintf (D, "%s", &w2[0].a));
-  T (sprintf (D, "%s", &w2[0].b));      /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.1s", &w2[0].b));
-  T (sprintf (D, "%.2s", &w2[0].b));    /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%s", w2[0].s));
-  T (sprintf (D, "%.3s", w2[0].s));
-  T (sprintf (D, "%.4s", w2[0].s));
-
-  T (sprintf (D, "%.2s", w2[0].s + 1));
-  T (sprintf (D, "%.3s", w2[0].s + 1));
-
-  T (sprintf (D, "%s", &w2[1].a));      /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.1s", &w2[1].a));
-  T (sprintf (D, "%.2s", &w2[1].a));    /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%s", &w2[1].b));
-  T (sprintf (D, "%s", w2[1].s));       /* { dg-warning "nul-terminated" } */
-  T (sprintf (D, "%.3s", w2[1].s));
-  T (sprintf (D, "%.4s", w2[1].s));     /* { dg-warning "nul-terminated" } */
-
-  T (sprintf (D, "%.2s", w2[1].s + 1));
-  T (sprintf (D, "%.3s", w2[1].s + 1)); /* { dg-warning "nul-terminated" } */
-
-  T (sprintf (D, "%s", &wcs3[3]));
-  T (sprintf (D, "%s", &wcs3[4]));      /* { dg-warning "\\\[-Warray-bounds" } */
-}
diff --git a/gcc/testsuite/gcc.dg/warn-sprintf-no-nul-3.c b/gcc/testsuite/gcc.dg/warn-sprintf-no-nul-3.c
new file mode 100644 (file)
index 0000000..1cfbe62
--- /dev/null
@@ -0,0 +1,71 @@
+/* PR tree-optimization/87756 - missing unterminated argument warning
+   using address of a constant character
+   { dg-do compile }
+   { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
+
+typedef __WCHAR_TYPE__ wchar_t;
+
+int sprintf (char*, const char*, ...);
+
+extern char* dest (void);
+extern void sink (int, ...);
+
+#define D dest ()
+#define T(expr)   sink (0, (expr))
+
+const wchar_t wnul = L'\0';
+const wchar_t wnonul = L'a';
+const wchar_t wcs3[] = L"123";
+
+const struct
+{
+  wchar_t a, b, s[3];
+} w1 = { L'\0', L'b', L"123" },
+  w2[2] = {
+  { L'\0', L'c', L"12" },
+  { L'd', L'\0', L"123" }
+  };
+
+void test_sprintf_ls (void)
+{
+  T (sprintf (D, "%ls", &wnul));
+  T (sprintf (D, "%ls", &wnonul));      /* { dg-warning "nul-terminated" } */
+  T (sprintf (D, "%.1ls", &wnonul));
+  T (sprintf (D, "%.2ls", &wnonul));    /* { dg-warning "nul-terminated" } */
+
+  T (sprintf (D, "%ls", &w1.a));
+  T (sprintf (D, "%ls", &w1.b));        /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%.1ls", &w1.b));
+  T (sprintf (D, "%.2ls", &w1.b));      /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%ls", w1.s));         /* { dg-warning "nul-terminated" } */
+  T (sprintf (D, "%.3ls", w1.s));
+  T (sprintf (D, "%.4ls", w1.s));       /* { dg-warning "nul-terminated" } */
+
+  T (sprintf (D, "%.2ls", w1.s + 1));
+  T (sprintf (D, "%.3ls", w1.s + 1));   /* { dg-warning "nul-terminated" } */
+
+  T (sprintf (D, "%ls", &w2[0].a));
+  T (sprintf (D, "%ls", &w2[0].b));     /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%.1ls", &w2[0].b));
+  T (sprintf (D, "%.2ls", &w2[0].b));   /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%ls", w2[0].s));
+  T (sprintf (D, "%.3ls", w2[0].s));
+  T (sprintf (D, "%.4ls", w2[0].s));
+
+  T (sprintf (D, "%.2ls", w2[0].s + 1));
+  T (sprintf (D, "%.3ls", w2[0].s + 1));
+
+  T (sprintf (D, "%ls", &w2[1].a));     /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%.1ls", &w2[1].a));
+  T (sprintf (D, "%.2ls", &w2[1].a));   /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
+  T (sprintf (D, "%ls", &w2[1].b));
+  T (sprintf (D, "%ls", w2[1].s));      /* { dg-warning "nul-terminated" } */
+  T (sprintf (D, "%.3ls", w2[1].s));
+  T (sprintf (D, "%.4ls", w2[1].s));    /* { dg-warning "nul-terminated" } */
+
+  T (sprintf (D, "%.2ls", w2[1].s + 1));
+  T (sprintf (D, "%.3ls", w2[1].s + 1));/* { dg-warning "nul-terminated" } */
+
+  T (sprintf (D, "%ls", &wcs3[3]));
+  T (sprintf (D, "%ls", &wcs3[4]));     /* { dg-warning "\\\[-Warray-bounds" } */
+}