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.

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.

-- Brane

Reply via email to