https://sourceware.org/bugzilla/show_bug.cgi?id=31863
Bug ID: 31863
Summary: Warnings about %z format when compiling ctf-open.c
with MinGW
Product: binutils
Version: 2.43 (HEAD)
Status: NEW
Severity: normal
Priority: P2
Component: libctf
Assignee: unassigned at sourceware dot org
Reporter: eliz at gnu dot org
Target Milestone: ---
When compiling ctf-open.c with mingw.org's MinGW tools (as part of building the
current pretest 15.0.91 of GDB), the compiler emits warnings about the use of
%z format specifier, like this:
CC libctf_la-ctf-open.lo
ctf-open.c: In function 'init_static_types':
ctf-open.c:979:18: warning: unknown conversion type character 'z' in
format [-Wformat=]
979 | ctf_dprintf ("%zu enum names hashed\n",
| ^
ctf-open.c:979:16: warning: too many arguments for format
[-Wformat-extra-args]
979 | ctf_dprintf ("%zu enum names hashed\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~
The reason is that ctf-impl.h defines the _libctf_printflike attribute like
this:
#define _libctf_printflike_(string_index,first_to_check) \
__attribute__ ((__format__ (__printf__, (string_index), (first_to_check))))
and then uses this attribute to declare the type of ctf_dprintf function:
_libctf_printflike_ (1, 2)
void ctf_dprintf (const char *format, ...)
{
The GCC manual says about the __format__ function attribute:
'format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)'
The 'format' attribute specifies that a function takes 'printf',
'scanf', 'strftime' or 'strfmon' style arguments that should be
type-checked against a format string.
[...]
The parameter ARCHETYPE determines how the format string is
interpreted, and should be 'printf', 'scanf', 'strftime',
'gnu_printf', 'gnu_scanf', 'gnu_strftime' or 'strfmon'. (You can
also use '__printf__', '__scanf__', '__strftime__' or
'__strfmon__'.) On MinGW targets, 'ms_printf', 'ms_scanf', and
'ms_strftime' are also present. ARCHETYPE values such as 'printf'
refer to the formats accepted by the system's C runtime library,
while values prefixed with 'gnu_' always refer to the formats
accepted by the GNU C Library.
Note the last sentence above: it means that using __printf__ invokes the
platform's default formats, and those don't include %z on MS-Windows. The
solution is to use __gnu_printf__ instead:
--- libctf/ctf-impl.h.~1~ 2024-05-26 18:55:53.000000000 +0300
+++ libctf/ctf-impl.h 2024-06-07 14:41:48.357697100 +0300
@@ -68,7 +68,7 @@ extern "C"
__attribute_blah__. */
#define _libctf_printflike_(string_index,first_to_check) \
- __attribute__ ((__format__ (__printf__, (string_index),
(first_to_check))))
+ __attribute__ ((__format__ (__gnu_printf__, (string_index),
(first_to_check))))
#define _libctf_unlikely_(x) __builtin_expect ((x), 0)
#define _libctf_unused_ __attribute__ ((__unused__))
#define _libctf_malloc_ __attribute__((__malloc__))
--
You are receiving this mail because:
You are on the CC list for the bug.