From: Erik de C. L. <ml...@me...> - 2012-02-25 23:00:54
|
Hi all, I'm using i686-w64-mingw32-gcc from Debian: COLLECT_GCC=i686-w64-mingw32-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-w64-mingw32/4.6/lto-wrapper Target: i686-w64-mingw32 Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --libexecdir='/usr/lib/gcc-mingw-w64' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --enable-version-specific-runtime-libs --enable-threads=win32 --enable-fully-dynamic-string --enable-sjlj-exceptions --enable-languages=c,c++,fortran,ada --enable-lto --with-plugin-ld --target=i686-w64-mingw32 --with-gxx-include-dir=/usr/include/c++/4.6 --with-as=/usr/bin/i686-w64-mingw32-as --with-ld=/usr/bin/i686-w64-mingw32-ld Thread model: win32 gcc version 4.6.1 (GCC) I have a 32 line test program included below and I'm compiling it with: $ i686-w64-mingw32-gcc -std=gnu99 -Wall -Wextra -Werror test.c -o test test.c: In function 'main': test.c:33:2: error: unknown conversion type character 'l' in format [-Werror=format] test.c:33:2: error: too many arguments for format [-Werror=format-extra-args] cc1: all warnings being treated as errors The problem seems to be that -Wforamt printf checking is not correct when using <stdarg.h> with __USE_MINGW_ANSI_STDIO defined to 1. If any one has access to the current SVN version of this compiler then I'd appreciate it if they could try this test program and see if this problem exists in HEAD. For the moment, I will disable printf format string checking when __USE_MINGW_ANSI_STDIO is set, but it would be nice to have format printf checking working in this configuration. Cheers, Erik #define __USE_MINGW_ANSI_STDIO 1 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdarg.h> #include <inttypes.h> #if __GNUC__ static inline void exit_if_true (int test, const char *format, ...) __attribute__ ((format (printf, 2, 3))) ; #endif static inline void exit_if_true (int test, const char *format, ...) { if (test) { va_list argptr ; va_start (argptr, format) ; vprintf (format, argptr) ; va_end (argptr) ; exit (1) ; } ; } int main (int argc, char ** argv) { int64_t x = 0 ; exit_if_true (argc > 1, "%s : x = %" PRId64 "\n", argv [0], x) ; return 0 ; } -- ---------------------------------------------------------------------- Erik de Castro Lopo http://www.mega-nerd.com/ |
From: Kai T. <kti...@go...> - 2012-02-25 23:31:36
|
Hi Erik, Your test-program is invalid. You should use here at: #if __GNUC__ static inline void exit_if_true (int test, const char *format, ...) __attribute__ ((format (gnu_printf, 2, 3))) ; #endif instead. The issue is that format(printf) remains for mingw-targets the MS printf-formatting check. But actually you want to check for the gnu-one. Regards, Kai |
From: Erik de C. L. <ml...@me...> - 2012-02-26 00:48:25
|
Kai Tietz wrote: > Your test-program is invalid. You should use here at: > > #if __GNUC__ > static inline void > exit_if_true (int test, const char *format, ...) > __attribute__ ((format (gnu_printf, 2, 3))) ; > #endif > > instead. The issue is that format(printf) remains for mingw-targets > the MS printf-formatting check. But actually you want to check for > the gnu-one. Thanks Kai, that fixed it. Cheers, Erik -- ---------------------------------------------------------------------- Erik de Castro Lopo http://www.mega-nerd.com/ |