From: Jakub Jelinek Date: Tue, 3 Feb 2026 08:18:34 +0000 (+0100) Subject: c++: Don't call cpp_translate_string on NULL string [PR123918] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31ca0008418821367eaec1fa7750c18442d18c5e;p=thirdparty%2Fgcc.git c++: Don't call cpp_translate_string on NULL string [PR123918] 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 PR c++/123918 * semantics.cc (cexpr_str::extract): Bypass cpp_translate_string for len == 0. --- diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 3e1a86fae6c..fb1be25edf5 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -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 "