Re: [RFA] Eliminate warnings about snprintf declaration

Daniel Jacobowitz
2005-05-12T15:08:12Z

On Thu, May 12, 2005 at 05:55:49PM +0300, Eli Zaretskii wrote:
> Okay, here're the patches to add snprintf and vsnprintf to the list of
> functions whose declarations are checked at configure time. Comments?

I recommend copying the libiberty maintainers directly to get their
attention.

Also, this isn't useful:

> @@ -282,7 +282,7 @@
> sysconf times sbrk gettimeofday ffs snprintf vsnprintf \
> pstat_getstatic pstat_getdynamic sysmp getsysinfo table sysctl wait3 wait4 \
> realpath canonicalize_file_name __fsetlocking)
> - AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf])
> + AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf])
> AC_DEFINE(HAVE_SYS_ERRLIST, 1, [Define if you have the sys_errlist variable.])
> AC_DEFINE(HAVE_SYS_NERR, 1, [Define if you have the sys_nerr variable.])
> AC_DEFINE(HAVE_SYS_SIGLIST, 1, [Define if you have the sys_siglist variable.])
> @@ -518,7 +518,7 @@
> [AC_MSG_RESULT([no])])
>
> AC_CHECK_FUNCS($checkfuncs)
> - AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf])
> + AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf])
> libiberty_NEED_DECLARATION(canonicalize_file_name)
> fi

That will only affect libiberty.h when building libiberty; it won't
affect the users of libiberty.

> +#if !HAVE_DECL_SNPRINTF
> +# ifdef HAVE_DECL_SNPRINTF
> + extern int snprintf ();
> +# else
> +/* Like sprintf but prints at most N characters. */
> + extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3;
> +# endif
> +#endif
> +
> +#if !HAVE_DECL_VSNPRINTF
> +# ifdef HAVE_DECL_VSNPRINTF
> + extern int vsnprintf ();
> +# else
> +/* Like vsprintf but prints at most N characters. */
> + extern int vsnprintf (char *, size_t, const char *, va_list);
> +# endif
> +#endif
> +

I believe you've got this logic reversed. You also don't want or need
the non-prototype - it's only needed for basename because basename
returns a pointer. How about this, based on the later examples in the
file:

#if defined (HAVE_DECL_SPRINTF) && !HAVE_DECL_SNPRINTF
/* Like sprintf but prints at most N characters. */
extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3;
#endif

#if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF
/* Like vsprintf but prints at most N characters. */
extern int vsnprintf (char *, size_t, const char *, va_list);
#endif

--
Daniel Jacobowitz
CodeSourcery, LLC