]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Don't call cpp_translate_string on NULL string [PR123918]
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 Feb 2026 08:18:34 +0000 (09:18 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 3 Feb 2026 08:18:34 +0000 (09:18 +0100)
My P2246R1 patch caused diagnostics reported by running ubsan
instrumented compiler on cpp26/static_assert1.C - if len is 0,
we don't bother to allocate msg, so it stays NULL, and when I've added
cpp_translate_string call, that can invoke memcpy (something, NULL, 0);
in that case.
While that is no longer UB in C2Y since N3322, libsanitizer doesn't
know that yet and reports it anyway.
While we could just do
      if (len)
        {
...
        }
      else
        msg = "";
there is really no point in trying to translate "" and allocate memory
for that, so the following patch instead by passes that translation for
len == 0.

2026-02-03  Jakub Jelinek  <jakub@redhat.com>

PR c++/123918
* semantics.cc (cexpr_str::extract): Bypass cpp_translate_string
for len == 0.

gcc/cp/semantics.cc

index 3e1a86fae6ca697be3e41d0c427c5e5fca9b3651..fb1be25edf5f5201aa5eb1b50b54d6bb39f6bdeb 100644 (file)
@@ -12860,7 +12860,10 @@ cexpr_str::extract (location_t location, const char * & msg, int &len)
       cpp_string istr, ostr;
       istr.len = len;
       istr.text = (const unsigned char *) msg;
-      if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING, true))
+      if (len == 0)
+       ;
+      else if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING,
+                                     true))
        {
          error_at (location, "could not convert constexpr string from "
                              "ordinary literal encoding to source character "