From 01cb1aa458516b9061a65ea4b8a2ca55f71cb34f Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 17 Jun 2010 01:12:20 +0000 Subject: [PATCH] Fix format string checking of '%c' by treating it as an integer conversion. Fixes PR 7391. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106196 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Analysis/Analyses/PrintfFormatString.h | 2 +- test/Sema/format-strings-fixit.c | 2 ++ test/Sema/format-strings.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/clang/Analysis/Analyses/PrintfFormatString.h b/include/clang/Analysis/Analyses/PrintfFormatString.h index 039e5a96e6..9aa7d6ff4e 100644 --- a/include/clang/Analysis/Analyses/PrintfFormatString.h +++ b/include/clang/Analysis/Analyses/PrintfFormatString.h @@ -57,6 +57,7 @@ public: InvalidSpecifier = 0, // C99 conversion specifiers. dArg, // 'd' + IntAsCharArg, // 'c' iArg, // 'i', oArg, // 'o', uArg, // 'u', @@ -70,7 +71,6 @@ public: GArg, // 'G', aArg, // 'a', AArg, // 'A', - IntAsCharArg, // 'c' CStrArg, // 's' VoidPtrArg, // 'p' OutIntPtrArg, // 'n' diff --git a/test/Sema/format-strings-fixit.c b/test/Sema/format-strings-fixit.c index bbdd4d8105..84f69f059e 100644 --- a/test/Sema/format-strings-fixit.c +++ b/test/Sema/format-strings-fixit.c @@ -15,6 +15,8 @@ void test() { printf("abc%0f", "testing testing 123"); printf("%u", (long) -12); printf("%p", 123); + printf("%c\n", "x"); + printf("%c\n", 1.23); // Larger types printf("%+.2d", (unsigned long long) 123456); diff --git a/test/Sema/format-strings.c b/test/Sema/format-strings.c index 72aa5927c3..b3c9cc98ef 100644 --- a/test/Sema/format-strings.c +++ b/test/Sema/format-strings.c @@ -172,6 +172,8 @@ void test10(int x, float f, int i, long long lli) { printf("%f\n", (long double) 1.0); // expected-warning{{conversion specifies type 'double' but the argument has type 'long double'}} // The man page says that a zero precision is okay. printf("%.0Lf", (long double) 1.0); // no-warning + printf("%c\n", "x"); // expected-warning{{conversion specifies type 'int' but the argument has type 'char *'}} + printf("%c\n", 1.23); // expected-warning{{conversion specifies type 'int' but the argument has type 'double'}} } void test11(void *p, char *s) { -- 2.50.1