From 9c48a8e6f43965b8d530159e5dbb2fc9d6083646 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 18 Nov 2022 10:48:03 -0500 Subject: [PATCH] gdb: fix symtab.c build on 32 bit targets MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When building on Ubuntu 22.04, gcc 12, x86-64 with -m32 and -O2, I get: CXX symtab.o /home/smarchi/src/binutils-gdb/gdb/symtab.c: In member function ‘std::vector global_symbol_searcher::search() const’: /home/smarchi/src/binutils-gdb/gdb/symtab.c:4961:44: error: ‘__builtin___sprintf_chk’ may write a terminating nul past the end of the destination [-Werror=format-overflow=] 4961 | sprintf (tmp, "operator%.*s%s", fix, " ", opname); | ^ In file included from /usr/include/stdio.h:894, from ../gnulib/import/stdio.h:43, from /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/common-defs.h:86, from /home/smarchi/src/binutils-gdb/gdb/defs.h:28, from /home/smarchi/src/binutils-gdb/gdb/symtab.c:20: In function ‘int sprintf(char*, const char*, ...)’, inlined from ‘std::vector global_symbol_searcher::search() const’ at /home/smarchi/src/binutils-gdb/gdb/symtab.c:4961:16: /usr/include/i386-linux-gnu/bits/stdio2.h:38:34: note: ‘__builtin___sprintf_chk’ output between 9 and 2147483648 bytes into a destination of size 2147483647 38 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 | __glibc_objsize (__s), __fmt, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 40 | __va_arg_pack ()); | ~~~~~~~~~~~~~~~~~ PR build/29798 shows a similar error message but on Solaris. Work around that by using string_printf. It is a good thing to get rid of the alloca anyway. Change-Id: Ifbac11fee3062ad7f134d596b4e2229dc5d166f9 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29798 --- gdb/symtab.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index ff8d24a5614..0d342f765f2 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4928,6 +4928,7 @@ global_symbol_searcher::search () const if (m_symbol_name_regexp != NULL) { const char *symbol_name_regexp = m_symbol_name_regexp; + std::string symbol_name_regexp_holder; /* Make sure spacing is right for C++ operators. This is just a courtesy to make the matching less sensitive @@ -4956,10 +4957,9 @@ global_symbol_searcher::search () const /* If wrong number of spaces, fix it. */ if (fix >= 0) { - char *tmp = (char *) alloca (8 + fix + strlen (opname) + 1); - - sprintf (tmp, "operator%.*s%s", fix, " ", opname); - symbol_name_regexp = tmp; + symbol_name_regexp_holder + = string_printf ("operator%.*s%s", fix, " ", opname); + symbol_name_regexp = symbol_name_regexp_holder.c_str (); } } -- 2.39.5