From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13095 invoked by alias); 8 Oct 2008 09:31:26 -0000 Received: (qmail 12608 invoked by uid 48); 8 Oct 2008 09:30:02 -0000 Date: Wed, 08 Oct 2008 09:31:00 -0000 Subject: [Bug c/37768] New: bogus warnings on x86_64-mingw32 due to attribute((format(printf))) breakage X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "mikpe at it dot uu dot se" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2008-10/txt/msg00568.txt.bz2 When gcc is configured to generate code for x86_64-pc-mingw32, that is MinGW for 64-bit Windows, attribute((format(printf))) is redefined by the backend to be compatible with MSVC's runtime library, which differs significantly from C99. This is fine for calls that link to MSVC's library, but it breaks code that uses private implementations of C99-compliant formatting routines, because the backend redefines ALL uses of attribute((format(printf))) to mean MSVC's printf not C99. The result is that C99-compliant code gets stray warnings and inadequate printf format checking on x86_64-pc-mingw32. The program below illustrates the issue. It declares a private C99-compliant snprintf() implementation and invokes it with "%zu" and "%llx" formats. This triggers the following bogus warnings on x86_64-pc-mingw32: > x86_64-pc-mingw32-gcc -std=c99 -O -Wall -c badwarning.c badwarning.c: In function 'main': badwarning.c:16: warning: unknown conversion type character 'z' in format badwarning.c:16: warning: unknown conversion type character 'l' in format badwarning.c:16: warning: too many arguments for format What I think the backend should do is to implement an "msprintf" format type, and then Mingw-w64 should declare printf() et al using that not plain "printf". /* badwarning.c */ #include #include int __attribute__((format(printf, 3, 4))) my_snprintf(char *buf, size_t n, const char *fmt, ...) { /* invoke C99 compliant private vsnprintf() here */ return 0; } int main(void) { char buf[64]; return my_snprintf(buf, sizeof buf, "%zu %llx", sizeof buf, 0ULL); } -- Summary: bogus warnings on x86_64-mingw32 due to attribute((format(printf))) breakage Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: mikpe at it dot uu dot se GCC target triplet: x86_64-pc-mingw32 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37768