Index | Thread | Search

From:
Pascal Stumpf <pascal@stumpf.co>
Subject:
Re: gcc/15 libestdc++: drop sprintf/strcpy ld warnings
To:
ports@openbsd.org
Date:
Mon, 15 Sep 2025 16:54:43 +0200

Download raw body.

Thread
On Sun, 14 Sep 2025 19:36:07 +0200, Jeremie Courreges-Anglas wrote:
> On Sun, Sep 14, 2025 at 05:51:17PM +0200, Jeremie Courreges-Anglas wrote:
> > 
> > ld.bfd spots it with a "hello, world!" program, ld.lld doesn't.  The
> > sprintf_ld() change is adapted from code already in lang/gcc/15.
> > Since that function is internal, it's not a problem.
> > 
> > With this, eg++ (-fuse-ld=bfd) doesn't warn about the sprintf use.
> > This matters for some overly picky ports that fail to find a working
> > C++ compiler when ld(1) spits any warning.  Diff for gcc/15 to follow.
> 
> Same for gcc/15 where more occurrences have crept up.
> 
> ok?

OK.

> 
> Index: Makefile
> ===================================================================
> RCS file: /home/cvs/ports/lang/gcc/15/Makefile,v
> diff -u -p -r1.6 Makefile
> --- Makefile	13 Sep 2025 14:45:15 -0000	1.6
> +++ Makefile	14 Sep 2025 16:00:49 -0000
> @@ -16,6 +16,8 @@ V = 15.2.0
>  FULL_VERSION = $V
>  FULL_PKGVERSION = $V
>  
> +REVISION = 0
> +
>  ADASTRAP-amd64 = adastrap-amd64-11.2.0-5.tar.xz
>  ADASTRAP-arm = adastrap-arm-4.9.4-0.tar.xz
>  ADASTRAP-hppa = adastrap-hppa-8.3.0-1.tar.xz
> Index: patches/patch-libiberty_cp-demangle_c
> ===================================================================
> RCS file: /home/cvs/ports/lang/gcc/15/patches/patch-libiberty_cp-demangle_c,v
> diff -u -p -r1.1.1.1 patch-libiberty_cp-demangle_c
> --- patches/patch-libiberty_cp-demangle_c	18 Aug 2025 19:49:24 -0000	1.1.1.1
> +++ patches/patch-libiberty_cp-demangle_c	14 Sep 2025 17:33:56 -0000
> @@ -1,12 +1,25 @@
> +Avoid using sprintf and strcpy: aside from their unsafety they trigger ld(1)
> +warnings, leading to broken feature detection when linking test
> +programs with libestdc++.
> +
>  Index: libiberty/cp-demangle.c
>  --- libiberty/cp-demangle.c.orig
>  +++ libiberty/cp-demangle.c
> +@@ -2832,7 +2832,7 @@ cplus_demangle_type (struct d_info *di)
> + 					      &cplus_demangle_builtin_types[34],
> + 					      arg, suffix);
> + 	    d_advance (di, 1);
> +-	    sprintf (buf, "%d", arg);
> ++	    snprintf (buf, sizeof buf, "%d", arg);
> + 	    di->expansion += ret->u.s_extended_builtin.type->len
> + 			     + strlen (buf) + (suffix != 0);
> + 	    break;
>  @@ -4618,7 +4618,7 @@ static inline void
>   d_append_num (struct d_print_info *dpi, int l)
>   {
>     char buf[25];
>  -  sprintf (buf,"%d", l);
> -+  snprintf (buf, 25, "%d", l);
> ++  snprintf (buf, sizeof buf, "%d", l);
>     d_append_string (dpi, buf);
>   }
>   
> Index: patches/patch-libstdc++-v3_src_c++11_debug_cc
> ===================================================================
> RCS file: /home/cvs/ports/lang/gcc/15/patches/patch-libstdc++-v3_src_c++11_debug_cc,v
> diff -u -p -r1.1.1.1 patch-libstdc++-v3_src_c++11_debug_cc
> --- patches/patch-libstdc++-v3_src_c++11_debug_cc	18 Aug 2025 19:49:25 -0000	1.1.1.1
> +++ patches/patch-libstdc++-v3_src_c++11_debug_cc	14 Sep 2025 17:33:28 -0000
> @@ -1,3 +1,7 @@
> +Avoid using sprintf: aside from its unsafety it triggers ld(1)
> +warnings, leading to broken feature detection when linking test
> +programs with libestdc++.
> +
>  Index: libstdc++-v3/src/c++11/debug.cc
>  --- libstdc++-v3/src/c++11/debug.cc.orig
>  +++ libstdc++-v3/src/c++11/debug.cc
> @@ -19,3 +23,30 @@ Index: libstdc++-v3/src/c++11/debug.cc
>       print_word(ctx, buf, written);
>     }
>   
> +@@ -1170,7 +1170,7 @@ namespace
> + 
> +     PrintContext& ctx = *static_cast<PrintContext*>(data);
> + 
> +-    int written = __builtin_sprintf(buf, "%p ", (void*)pc);
> ++    int written = __builtin_snprintf(buf, sizeof buf, "%p ", (void*)pc);
> +     print_word(ctx, buf, written);
> + 
> +     int ret = 0;
> +@@ -1198,7 +1198,7 @@ namespace
> + 
> + 	if (lineno)
> + 	  {
> +-	    written = __builtin_sprintf(buf, ":%u\n", lineno);
> ++	    written = __builtin_snprintf(buf, sizeof buf, ":%u\n", lineno);
> + 	    print_word(ctx, buf, written);
> + 	  }
> + 	else
> +@@ -1221,7 +1221,7 @@ namespace
> +     if (errnum > 0)
> +       {
> + 	char buf[64];
> +-	int written = __builtin_sprintf(buf, " (errno=%d)\n", errnum);
> ++	int written = __builtin_snprintf(buf, sizeof buf, " (errno=%d)\n", errnum);
> + 	print_word(ctx, buf, written);
> +       }
> +     else
> Index: patches/patch-libstdc++-v3_src_c++17_floating_to_chars_cc
> ===================================================================
> RCS file: patches/patch-libstdc++-v3_src_c++17_floating_to_chars_cc
> diff -N patches/patch-libstdc++-v3_src_c++17_floating_to_chars_cc
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libstdc++-v3_src_c++17_floating_to_chars_cc	14 Sep 2025 17:33:43 -0000
> @@ -0,0 +1,24 @@
> +Avoid using sprintf: aside from its unsafety it triggers ld(1)
> +warnings, leading to broken feature detection when linking test
> +programs with libestdc++.
> +
> +Index: libstdc++-v3/src/c++17/floating_to_chars.cc
> +--- libstdc++-v3/src/c++17/floating_to_chars.cc.orig
> ++++ libstdc++-v3/src/c++17/floating_to_chars.cc
> +@@ -1073,14 +1073,14 @@ namespace
> + 	  {
> + 	    // strfromf128 unfortunately doesn't allow .*
> + 	    char fmt[3 * sizeof(int) + 6];
> +-	    sprintf(fmt, "%%.%d%c", args..., int(format_string[4]));
> ++	    snprintf(fmt, sizeof(fmt), "%%.%d%c", args..., int(format_string[4]));
> + 	    len = __strfromf128(buffer, length, fmt, value);
> + 	  }
> +       }
> +     else
> + #endif
> + #endif
> +-    len = sprintf(buffer, format_string, args..., value);
> ++    len = snprintf(buffer, length, format_string, args..., value);
> + 
> + #if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
> +     if (saved_rounding_mode != FE_TONEAREST)
> Index: patches/patch-libstdc++-v3_src_c++20_format_cc
> ===================================================================
> RCS file: patches/patch-libstdc++-v3_src_c++20_format_cc
> diff -N patches/patch-libstdc++-v3_src_c++20_format_cc
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libstdc++-v3_src_c++20_format_cc	14 Sep 2025 17:34:28 -0000
> @@ -0,0 +1,19 @@
> +Avoid using strcpy: aside from its unsafety it triggers ld(1)
> +warnings, leading to broken feature detection when linking test
> +programs with libestdc++.
> +
> +Index: libstdc++-v3/src/c++20/format.cc
> +--- libstdc++-v3/src/c++20/format.cc.orig
> ++++ libstdc++-v3/src/c++20/format.cc
> +@@ -189,8 +189,9 @@ __with_encoding_conversion(const locale& loc)
> +   // just don't delete[] it in the locale(locale, Facet*) constructor.
> +   if (const char* name = loc._M_impl->_M_names[0])
> +     {
> +-      loc2._M_impl->_M_names[0] = new char[strlen(name) + 1];
> +-      strcpy(loc2._M_impl->_M_names[0], name);
> ++      size_t sz = strlen(name) + 1;
> ++      loc2._M_impl->_M_names[0] = new char[sz];
> ++      strlcpy(loc2._M_impl->_M_names[0], name, sz);
> +     }
> +   return loc2;
> + }
> 
> -- 
> jca