https://github.com/lakreite updated https://github.com/llvm/llvm-project/pull/158514
>From ef99801b67c51694186b5c872a75c4b6dab406a3 Mon Sep 17 00:00:00 2001 From: lakreite <lakre...@gmail.com> Date: Sun, 14 Sep 2025 23:46:45 +0300 Subject: [PATCH] [Sema] Fix missing warnings for unused args with invalid printf specs. --- clang/lib/AST/PrintfFormatString.cpp | 2 +- clang/test/Sema/format-strings.c | 28 +++++++++---------- clang/test/SemaObjC/format-strings-objc.m | 10 +++---- .../test/SemaOpenCL/printf-format-strings.cl | 12 ++++---- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/clang/lib/AST/PrintfFormatString.cpp b/clang/lib/AST/PrintfFormatString.cpp index 855550475721a..f829696a26473 100644 --- a/clang/lib/AST/PrintfFormatString.cpp +++ b/clang/lib/AST/PrintfFormatString.cpp @@ -440,7 +440,7 @@ bool clang::analyze_format_string::ParsePrintfString(FormatStringHandler &H, // Did a fail-stop error of any kind occur when parsing the specifier? // If so, don't do any more processing. if (FSR.shouldStop()) - return true; + return false; // Did we exhaust the string or encounter an error that // we can recover from? if (!FSR.hasValue()) diff --git a/clang/test/Sema/format-strings.c b/clang/test/Sema/format-strings.c index af30ad5d15fe2..e2f03089c12be 100644 --- a/clang/test/Sema/format-strings.c +++ b/clang/test/Sema/format-strings.c @@ -207,9 +207,9 @@ void check_invalid_specifier(FILE* fp, char *buf) void check_null_char_string(char* b) { - printf("\0this is bogus%d",1); // expected-warning {{string contains '\0'}} - snprintf(b,10,"%%%%%d\0%d",1,2); // expected-warning {{string contains '\0'}} - printf("%\0d",1); // expected-warning {{string contains '\0'}} + printf("\0this is bogus%d",1); // expected-warning {{string contains '\0'}} expected-warning {{data argument not used by format string}} + snprintf(b,10,"%%%%%d\0%d",1,2); // expected-warning {{string contains '\0'}} expected-warning {{data argument not used by format string}} + printf("%\0d",1); // expected-warning {{string contains '\0'}} expected-warning {{data argument not used by format string}} } void check_empty_format_string(char* buf, ...) @@ -297,7 +297,7 @@ void test10(int x, float f, int i, long long lli) { printf("%W%d\n", x, x); // expected-warning{{invalid conversion specifier 'W'}} expected-warning {{data argument not used by format string}} printf("%"); // expected-warning{{incomplete format specifier}} printf("%.d", x); // no-warning - printf("%.", x); // expected-warning{{incomplete format specifier}} + printf("%.", x); // expected-warning{{incomplete format specifier}} expected-warning {{data argument not used by format string}} printf("%f", 4); // expected-warning{{format specifies type 'double' but the argument has type 'int'}} printf("%qd", lli); // no-warning printf("%qd", x); // expected-warning{{format specifies type 'long long' but the argument has type 'int'}} @@ -390,8 +390,8 @@ void test_unicode_conversions(wchar_t *s) { // This is an IEEE extension (IEEE Std 1003.1). // FIXME: This is probably not portable everywhere. void test_positional_arguments(void) { - printf("%0$", (int)2); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} - printf("%1$*0$d", (int) 2); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} + printf("%0$", (int)2); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} expected-warning{{data argument not used by format string}} + printf("%1$*0$d", (int) 2); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} expected-warning{{data argument not used by format string}} printf("%1$d", (int) 2); // no-warning printf("%1$d", (int) 2, 2); // expected-warning{{data argument not used by format string}} printf("%1$d%1$f", (int) 2); // expected-warning{{format specifies type 'double' but the argument has type 'int'}} @@ -595,16 +595,16 @@ void pr9751(void) { printf("%y", 5); // expected-warning{{invalid conversion specifier 'y'}} const char kFormat5[] = "%."; // expected-note{{format string is defined here}} - printf(kFormat5, 5); // expected-warning{{incomplete format specifier}} - printf("%.", 5); // expected-warning{{incomplete format specifier}} + printf(kFormat5, 5); // expected-warning{{incomplete format specifier}} expected-warning{{data argument not used by format string}} + printf("%.", 5); // expected-warning{{incomplete format specifier}} expected-warning{{data argument not used by format string}} const char kFormat6[] = "%s"; // expected-note{{format string is defined here}} printf(kFormat6, 5); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}} printf("%s", 5); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}} const char kFormat7[] = "%0$"; // expected-note{{format string is defined here}} - printf(kFormat7, 5); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} - printf("%0$", 5); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} + printf(kFormat7, 5); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} expected-warning{{data argument not used by format string}} + printf("%0$", 5); // expected-warning{{position arguments in format strings start counting at 1 (not 0)}} expected-warning{{data argument not used by format string}} const char kFormat8[] = "%1$d %d"; // expected-note{{format string is defined here}} printf(kFormat8, 4, 4); // expected-warning{{cannot mix positional and non-positional arguments in format string}} @@ -615,8 +615,8 @@ void pr9751(void) { printf("", 4, 4); // expected-warning{{format string is empty}} const char kFormat10[] = "\0%d"; // expected-note{{format string is defined here}} - printf(kFormat10, 4); // expected-warning{{format string contains '\0' within the string body}} - printf("\0%d", 4); // expected-warning{{format string contains '\0' within the string body}} + printf(kFormat10, 4); // expected-warning{{format string contains '\0' within the string body}} expected-warning{{data argument not used by format string}} + printf("\0%d", 4); // expected-warning{{format string contains '\0' within the string body}} expected-warning{{data argument not used by format string}} const char kFormat11[] = "%*d"; // expected-note{{format string is defined here}} printf(kFormat11); // expected-warning{{'*' specified field width is missing a matching 'int' argument}} @@ -720,8 +720,8 @@ extern void test14_bar(const char *, const char *, ...) __attribute__((__format__(__printf__, 1, 3))); void test14_zed(int *p) { - test14_foo("%", "%d", p); // expected-warning{{incomplete format specifier}} - test14_bar("%", "%d", p); // expected-warning{{incomplete format specifier}} + test14_foo("%", "%d", p); // expected-warning{{incomplete format specifier}} expected-warning{{data argument not used by format string}} + test14_bar("%", "%d", p); // expected-warning{{incomplete format specifier}} expected-warning{{data argument not used by format string}} } #if !defined(__ANDROID__) && !defined(__Fuchsia__) diff --git a/clang/test/SemaObjC/format-strings-objc.m b/clang/test/SemaObjC/format-strings-objc.m index 40c1d31b1fd4c..aba1f6153a9a4 100644 --- a/clang/test/SemaObjC/format-strings-objc.m +++ b/clang/test/SemaObjC/format-strings-objc.m @@ -274,15 +274,15 @@ void testUnicode(void) { // Test Objective-C modifier flags. void testObjCModifierFlags(void) { - NSLog(@"%[]@", @"Foo"); // expected-warning {{missing object format flag}} - NSLog(@"%[", @"Foo"); // expected-warning {{incomplete format specifier}} - NSLog(@"%[tt", @"Foo"); // expected-warning {{incomplete format specifier}} + NSLog(@"%[]@", @"Foo"); // expected-warning {{missing object format flag}} expected-warning{{data argument not used by format string}} + NSLog(@"%[", @"Foo"); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} + NSLog(@"%[tt", @"Foo"); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} NSLog(@"%[tt]@", @"Foo"); // no-warning NSLog(@"%[tt]@ %s", @"Foo", "hello"); // no-warning NSLog(@"%s %[tt]@", "hello", @"Foo"); // no-warning - NSLog(@"%[blark]@", @"Foo"); // expected-warning {{'blark' is not a valid object format flag}} + NSLog(@"%[blark]@", @"Foo"); // expected-warning {{'blark' is not a valid object format flag}} expected-warning{{data argument not used by format string}} NSLog(@"%2$[tt]@ %1$[tt]@", @"Foo", @"Bar"); // no-warning - NSLog(@"%2$[tt]@ %1$[tt]s", @"Foo", @"Bar"); // expected-warning {{object format flags cannot be used with 's' conversion specifier}} + NSLog(@"%2$[tt]@ %1$[tt]s", @"Foo", @"Bar"); // expected-warning {{object format flags cannot be used with 's' conversion specifier}} expected-warning{{data argument not used by format string}} } @interface RD23622446_Tester: NSObject diff --git a/clang/test/SemaOpenCL/printf-format-strings.cl b/clang/test/SemaOpenCL/printf-format-strings.cl index 6cdfc7e60b379..e5b1e5a914290 100644 --- a/clang/test/SemaOpenCL/printf-format-strings.cl +++ b/clang/test/SemaOpenCL/printf-format-strings.cl @@ -96,18 +96,18 @@ kernel void format_v4f32(float4 arg) kernel void format_only_v(int arg) { - printf("%v", arg); // expected-warning {{incomplete format specifier}} + printf("%v", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} } kernel void format_missing_num(int arg) { - printf("%v4", arg); // expected-warning {{incomplete format specifier}} + printf("%v4", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} } kernel void format_not_num(int arg) { - printf("%vNd", arg); // expected-warning {{incomplete format specifier}} - printf("%v*d", arg); // expected-warning {{incomplete format specifier}} + printf("%vNd", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} + printf("%v*d", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} } kernel void format_v16i32(int16 arg) @@ -127,7 +127,7 @@ kernel void format_v4i32_wrong_num_elts_2_to_4(int2 arg) kernel void format_missing_num_elts_format(int4 arg) { - printf("%vd\n", arg); // expected-warning {{incomplete format specifier}} + printf("%vd\n", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} } kernel void format_v4f32_scalar(float arg) @@ -142,7 +142,7 @@ kernel void format_v4f32_wrong_num_elts(float2 arg) kernel void format_missing_num_elts(float4 arg) { - printf("%vf\n", arg); // expected-warning {{incomplete format specifier}} + printf("%vf\n", arg); // expected-warning {{incomplete format specifier}} expected-warning{{data argument not used by format string}} } kernel void vector_precision_modifier_v4i32_to_v4f32(int4 arg) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits