[flac-dev] MinGW vs. vsnprintf

lvqcl lvqcl.mail at gmail.com
Fri Sep 12 11:28:04 PDT 2014

NAKAI Yuta <nak5124 at live.jp> писал(а) в своём письме Fri, 12 Sep 2014 19:28:32 +0400:

> When using -D__USE_MINGW_ANSI_STDIO=1 on MINGW, mingw doesn't use MSVCRT.


Currently FLAC has flac_snprintf() function in src/share/grabbag/snprintf.c
(and its exact copy local_snprintf() in src/libFLAC/metadata_iterators.c):

  * The _MSC_VER code below attempts to modify the return code for snprintf_s
  * to something that is more compatible with the behaviour of the ISO C version.
int flac_snprintf(char *str, size_t size, const char *fmt, ...)
	va_list va;
	int rc ;
	va_start (va, fmt);
#ifdef _MSC_VER
	rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va);
	rc = (rc > 0) ? rc : (size == 0 ? 1024 : size * 2);
	rc = vsnprintf (str, size, fmt, va);
	va_end (va);
	return rc;

The code implies that non-MSVC vsnprintf always has standart behavior.
But it looks like MinGW has 2 versions of vsnprintf: its own standard-conforming
and non-conforming from msvcrt.dll.

So flac_snprintf() can return unexpected value when compiled with MinGW.

More information about the flac-dev mailing list