On Wed, Jun 3, 2026 at 8:00 AM Branko Čibej <[email protected]> wrote:
> On 3. 6. 2026 13:52, Nathan Hartman wrote: > > On Wed, Jun 3, 2026 at 7:03 AM <[email protected]> wrote: > >> Author: brane >> Date: Wed Jun 3 11:03:37 2026 >> New Revision: 1934920 >> >> Log: >> Use snprintf instead of sprintf if it's available. >> >> * CMakeLists.txt: Check for snprintf. >> * build/ac-macros/compiler.m4: Check for snprintf. >> >> * subversion/svn/filesize.c: Include svn_private_config.h. >> (format_size): Use snprintf if it's available. >> >> * subversion/tests/libsvn_subr/skel-test.c: Include svn_private_config.h. >> (put_explicit_length): Use snprintf if it's available. >> >> Modified: >> subversion/trunk/CMakeLists.txt >> subversion/trunk/build/ac-macros/compiler.m4 >> subversion/trunk/subversion/svn/filesize.c >> subversion/trunk/subversion/tests/libsvn_subr/skel-test.c >> >> Modified: subversion/trunk/CMakeLists.txt >> >> ============================================================================== >> --- subversion/trunk/CMakeLists.txt Wed Jun 3 10:44:38 2026 >> (r1934919) >> +++ subversion/trunk/CMakeLists.txt Wed Jun 3 11:03:37 2026 >> (r1934920) >> @@ -872,6 +872,8 @@ macro(autocheck_symbol_exists SYMBOL FIL >> endif() >> endmacro() >> >> +autocheck_symbol_exists("snprintf" "string.h" HAVE_SNPRINTF) >> + >> autocheck_include_files("elf.h" HAVE_ELF_H) >> autocheck_include_files("inttypes.h" HAVE_INTTYPES_H) >> autocheck_include_files("stdbool.h" HAVE_STDBOOL_H) >> >> Modified: subversion/trunk/build/ac-macros/compiler.m4 >> >> ============================================================================== >> --- subversion/trunk/build/ac-macros/compiler.m4 Wed Jun 3 >> 10:44:38 2026 (r1934919) >> +++ subversion/trunk/build/ac-macros/compiler.m4 Wed Jun 3 >> 11:03:37 2026 (r1934920) >> @@ -71,6 +71,9 @@ AC_DEFUN([SVN_CC_MODE_SETUP], >> ]) >> fi >> >> + dnl check for snprintf so that we can use it instead of sprintf. >> + AC_CHECK_FUNCS(snprintf) >> + >> CMODEFLAGS="$CFLAGS" >> CFLAGS="" >> SVN_DOT_CLANGD_CC([$CMODEFLAGS]) >> >> Modified: subversion/trunk/subversion/svn/filesize.c >> >> ============================================================================== >> --- subversion/trunk/subversion/svn/filesize.c Wed Jun 3 10:44:38 2026 >> (r1934919) >> +++ subversion/trunk/subversion/svn/filesize.c Wed Jun 3 11:03:37 2026 >> (r1934920) >> @@ -31,6 +31,7 @@ >> #include <apr_strings.h> >> >> #include "cl.h" >> +#include "svn_private_config.h" >> >> >> /*** Code. ***/ >> @@ -72,16 +73,6 @@ format_size(double human_readable_size, >> apr_size_t index, >> apr_pool_t *result_pool) >> { >> - /* Apple in its infinite wisdom has seen fit to deprecate sprintf() >> which >> - has been part of the C standard library since the K&R days and is >> not >> - deprecated in any version of the C standard. */ >> -#ifdef __APPLE__ >> -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) >> -# pragma GCC diagnostic push >> -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" >> -# endif >> -#endif /* __APPLE__ */ >> - >> /* NOTE: We want to display a locale-specific decimal sepratator, but >> APR's formatter completely ignores the locale. So we use the >> good, old, standard, *dangerous* sprintf() to format the size. >> @@ -107,22 +98,26 @@ format_size(double human_readable_size, >> the absolute size is actually a single-digit number, because >> files can't have fractional byte sizes. */ >> if (absolute_human_readable_size >= 10) >> - sprintf(buffer, "%.0f", human_readable_size); >> + { >> +#if !HAVE_SNPRINTF >> + sprintf(buffer, "%.0f", human_readable_size); >> +#else >> + snprintf(buffer, sizeof(buffer), "%.0f", human_readable_size); >> +#endif >> + } >> else >> { >> double integral; >> const double frac = modf(absolute_human_readable_size, >> &integral); >> const int decimals = (index > 0 && (integral < 9 || frac <= >> .949999999)); >> +#if !HAVE_SNPRINTF >> sprintf(buffer, "%.*f", decimals, human_readable_size); >> +#else >> + snprintf(buffer, sizeof(buffer), "%.*f", decimals, >> human_readable_size); >> +#endif >> } >> >> return apr_pstrcat(result_pool, buffer, suffix, SVN_VA_NULL); >> - >> -#ifdef __APPLE__ >> -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) >> -# pragma GCC diagnostic pop >> -# endif >> -#endif /* __APPLE__ */ >> } >> >> >> >> Modified: subversion/trunk/subversion/tests/libsvn_subr/skel-test.c >> >> ============================================================================== >> --- subversion/trunk/subversion/tests/libsvn_subr/skel-test.c Wed Jun >> 3 10:44:38 2026 (r1934919) >> +++ subversion/trunk/subversion/tests/libsvn_subr/skel-test.c Wed Jun >> 3 11:03:37 2026 (r1934920) >> @@ -33,6 +33,7 @@ >> >> #include "../svn_test.h" >> #include "../svn_test_fs.h" >> +#include "svn_private_config.h" >> >> >> /* Some utility functions. */ >> @@ -307,24 +308,19 @@ put_explicit_length(svn_stringbuf_t *str >> apr_size_t len, >> char sep) >> { >> - /* Apple in its infinite wisdom has seen fit to deprecate sprintf() >> which >> - has been part of the C standard library since the K&R days and is >> not >> - deprecated in any version of the C standard. */ >> -#ifdef __APPLE__ >> -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) >> -# pragma GCC diagnostic push >> -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" >> -# endif >> -#endif /* __APPLE__ */ >> - >> - char *buf = malloc(len + 100); >> + const apr_size_t alloc_len = len + 100; >> + char *buf = malloc(alloc_len); >> apr_size_t length_len; >> >> if (! skel_is_space(sep)) >> abort(); >> >> /* Generate the length and separator character. */ >> +#if !HAVE_SNPRINTF >> sprintf(buf, "%"APR_SIZE_T_FMT"%c", len, sep); >> +#else >> + snprintf(buf, alloc_len, "%"APR_SIZE_T_FMT"%c", len, sep); >> +#endif >> length_len = strlen(buf); >> >> /* Copy in the real data (which may contain nulls). */ >> @@ -332,12 +328,6 @@ put_explicit_length(svn_stringbuf_t *str >> >> svn_stringbuf_appendbytes(str, buf, length_len + len); >> free(buf); >> - >> -#ifdef __APPLE__ >> -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) >> -# pragma GCC diagnostic pop >> -# endif >> -#endif /* __APPLE__ */ >> } >> >> >> >> > Out of curiosity, what made you change your mind? > > (I'm glad to see it, because I think this is simpler and more future-proof > than checking for specific GNUC version values on Apple machines. It's also > much more self-documenting.) > > > > Basically, 1.15.x vs trunk. It's appropriate to silence the warning in > 1.15.x, but not to push essentially untested code into a new release. This > change will have time to settle on trunk for 1.16. I don't intend to > propose this commit for backport. > Sounds perfectly sensible to me. +1 to this plan. I still have a very concrete opinion about deprecating standard functions, > that has not and will not change. People who want to "fix" the C library > should put the work in, get on the appropriate ISO committee, and see how > they like that. It's easier to get specific warnings into gcc/clang. > Well, they'd have to get on the C89 committee or, better yet, go farther back and have a talk with K&R. Getting a working time machine is trivial and left as an exercise. Nathan

