JonY wrote:
> On 1/6/2012 04:42, Kai Tietz wrote:
>> 2012/1/5 Christian Franke<[email protected]>:
>>> [Originally sent to Cygwin mailing list]
>>>
>>> When printf/scanf functions from MinGW runtime are selected via
>>> __USE_MINGW_ANSI_STDIO, then format string checking is broken. This only
>>> affects the C++ compiler:
>>>
>>> $ cygcheck -f /usr/bin/i686-w64-mingw32-g++
>>> mingw64-i686-gcc-g++-4.5.3-4
>>>
>>> $ cat testfmt.c
>>> #define __USE_MINGW_ANSI_STDIO 1
>>> #include<stdio.h>
>>>
>>> void myprintf(const char *, ...)
>>>    __attribute__((format(gnu_printf,1,2)));
>>>
>>> int main()
>>> {
>>>    long long x = 42;
>>>    printf("%lld\n", x); // C++: Bogus warning
>>>    myprintf("%lld\n", x); // No warning (OK)
>>>    printf("%I64d\n", x); // Warning (OK)
>>>    return 0;
>>> }
>>>
>>> $ i686-w64-mingw32-gcc -Wformat -c testfmt.c
>>> testfmt.c: In function 'main':
>>> testfmt.c:12:3: warning: format '%I64d' expects type 'int', but argument
>>> 2 has type 'long long int'
>>>
>>> $ i686-w64-mingw32-g++ -Wformat -c testfmt.c
>>> testfmt.c: In function 'int main()':
>>> testfmt.c:10:21: warning: unknown conversion type character 'l' in format
>>> testfmt.c:10:21: warning: too many arguments for format
>>> testfmt.c:12:22: warning: format '%I64d' expects type 'int', but
>>> argument 2 has type 'long long int'
>>>
>>>
>>> Interestingly the bogus warning only occurs for standard functions like
>>> printf(). These are replaced by inline functions in MinGW stdio.h if
>>> __USE_MINGW_ANSI_STDIO is set. Probably a subtle bug in the handling of
>>> functions known by the compiler.
>> Issue is fixed on trunk.  Version 2 branch still has those issues, as
>> fixes to stdio.h and wchar.h were not merged back.
>>
> Looks like I need to do a new header/crt release soon.

Thanks - but unfortunately the bug is still present after update to 
mingw64-i686-headers-3.0b_svn4725-1

The bug is likely in g++ itself. If __USE_MINGW_ANSI_STDIO is not set, 
format checking works, but interestingly the prototype does not provide 
a format attribute in this case:

/usr/i686-w64-mingw32/sys-root/mingw/include/stdio.h:
...
#if __USE_MINGW_ANSI_STDIO
...
__mingw_ovr
__attribute__((__format__ (gnu_printf, 1, 2))) ...
int printf (const char *__format, ...) { ... }
...
#else /* !__USE_MINGW_ANSI_STDIO */
...
   int __cdecl printf(const char * __restrict__ _Format,...);
   // __attribute__((__format__(ms_printf, 1, 2))) <<--- MISSING!
...
#endif /* __USE_MINGW_ANSI_STDIO */

So there is likely some special handling for printf() done by the compiler.
(Another: gcc/g++ convert printf("Foo\n") to puts("Foo") regardless of 
-O level).

Overriding the build in format attribute by the new printf() inline 
wrapper in MinGW stdio.h might not work properly.

Christian


------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to