From ff7be48165548c9c01492010609d166973607068 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Wed, 5 Dec 2012 18:44:37 +0000 Subject: [PATCH] Format strings: the correct conversion for 'char' is %c, not %d or %hhd. We tried to account for 'uint8_t' by saying that /typedefs/ of 'char' should be corrected as %hhd rather than %c, but the condition was wrong. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169397 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/PrintfFormatString.cpp | 2 +- test/FixIt/format.m | 54 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp index 611815cd89..08207910b8 100644 --- a/lib/Analysis/PrintfFormatString.cpp +++ b/lib/Analysis/PrintfFormatString.cpp @@ -506,7 +506,7 @@ bool PrintfSpecifier::fixType(QualType QT, const LangOptions &LangOpt, // Set conversion specifier and disable any flags which do not apply to it. // Let typedefs to char fall through to int, as %c is silly for uint8_t. - if (isa(QT) && QT->isAnyCharacterType()) { + if (!isa(QT) && QT->isCharType()) { CS.setKind(ConversionSpecifier::cArg); LM.setKind(LengthModifier::None); Precision.setHowSpecified(OptionalAmount::NotSpecified); diff --git a/test/FixIt/format.m b/test/FixIt/format.m index c4747019b2..4b13c2cf95 100644 --- a/test/FixIt/format.m +++ b/test/FixIt/format.m @@ -93,3 +93,57 @@ void test_named_fixed_enum_correction(enum SomeSize x) { // CHECK: fix-it:"{{.*}}":{92:11-92:13}:"%zu" } + +typedef unsigned char uint8_t; +void test_char(char c, signed char s, unsigned char u, uint8_t n) { + NSLog(@"%s", c); // expected-warning{{format specifies type 'char *' but the argument has type 'char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%lf", c); // expected-warning{{format specifies type 'double' but the argument has type 'char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%c" + + NSLog(@"%@", c); // expected-warning{{format specifies type 'id' but the argument has type 'char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%c", c); // no-warning + // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + + NSLog(@"%s", s); // expected-warning{{format specifies type 'char *' but the argument has type 'signed char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%lf", s); // expected-warning{{format specifies type 'double' but the argument has type 'signed char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%c" + + NSLog(@"%@", s); // expected-warning{{format specifies type 'id' but the argument has type 'signed char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%c", s); // no-warning + // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + + NSLog(@"%s", u); // expected-warning{{format specifies type 'char *' but the argument has type 'unsigned char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%lf", u); // expected-warning{{format specifies type 'double' but the argument has type 'unsigned char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%c" + + NSLog(@"%@", u); // expected-warning{{format specifies type 'id' but the argument has type 'unsigned char'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + NSLog(@"%c", u); // no-warning + // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" + + + NSLog(@"%s", n); // expected-warning{{format specifies type 'char *' but the argument has type 'uint8_t' (aka 'unsigned char')}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%hhu" + + NSLog(@"%lf", n); // expected-warning{{format specifies type 'double' but the argument has type 'uint8_t' (aka 'unsigned char')}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%hhu" + + NSLog(@"%@", n); // expected-warning{{format specifies type 'id' but the argument has type 'uint8_t' (aka 'unsigned char')}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%hhu" + + NSLog(@"%c", n); // no-warning + // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%hhu" +} -- 2.40.0