https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127370
Bug ID: 127370
Summary: Incorrect warning for ms_printf format %hs [-Wformat=]
Product: gcc
Version: 16.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: pali at kernel dot org
Target Milestone: ---
https://godbolt.org/z/ccjPqoEKK
Simple code which uses ms_printf format %hs
int printf(const char *format, ...) __attribute__((format(ms_printf, 1, 2)));
int test(char chr, const char *str) { return printf("%hc %hs", chr, str); }
produces following warning:
warning: format '%hs' expects argument of type 'short int *', but argument 3
has type 'const char *' [-Wformat=]
This is wrong as h size modifier for s format in all MS CRT DLL libraries
(crtdll, msvcrt10-40, msvcrt, msvcr70-120, ucrt) requires narrow string (const
char *) argument, not some pointer to short int array (which looks like wide
string).
Documentation resources:
msvcrt40.dll -
https://archive.org/embed/bitsavers_microsoftv95VisualCVersion4Volume51995_30331194/page/489
msvcrt.dll(5) -
https://archive.org/embed/bitsavers_microsoftv7VisualC5.0Volume3RunTimeLibraryReferenc_41063058/page/468
msvcrt.dll(6) -
https://web.archive.org/web/20010311140700/http://msdn.microsoft.com/library/devprods/vs6/visualc/vccore/_crt_size_and_distance_specification.htm#_crt_table_r..6
msvcr70.dll -
https://web.archive.org/web/20020404173935/http://msdn.microsoft.com/library/en-us/vclib/html/_crt_size_and_distance_specification.asp#_crt_table_r..6
msvcr71.dll -
https://web.archive.org/web/20030728214654/http://www.msdn.microsoft.com/library/en-us/vclib/html/_crt_size_and_distance_specification.asp?FRAME=true#_crt_table_r..6
msvcr80.dll -
https://web.archive.org/web/20070311115706/http://msdn2.microsoft.com/en-us/library/tcxf1dw6(VS.80).aspx
msvcr90.dll -
https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/tcxf1dw6(v=vs.90)
msvcr100.dll -
https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/tcxf1dw6(v=vs.100)
msvcr110.dll -
https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/tcxf1dw6(v=vs.110)
msvcr120.dll -
https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/tcxf1dw6(v=vs.120)
ucrt -
https://learn.microsoft.com/en-us/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions#size-prefixes-for-printf-and-wprintf-format-type-specifiers