diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-09-29 05:52:16 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-09-29 05:52:16 +0000 |
commit | 6e302b2e6e8912a2e92ee035b6412a5d098ade1c (patch) | |
tree | e689eefa31eea2add91bf16cacb4eef19f9892b4 | |
parent | dd1904e7a67682d4620b74287d3438ef7e618460 (diff) | |
download | bcm5719-llvm-6e302b2e6e8912a2e92ee035b6412a5d098ade1c.tar.gz bcm5719-llvm-6e302b2e6e8912a2e92ee035b6412a5d098ade1c.zip |
Do not warn about empty format strings when there are no data arguments. Fixes <rdar://problem/9473155>.
llvm-svn: 140777
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 13 | ||||
-rw-r--r-- | clang/test/Sema/format-strings.c | 7 |
2 files changed, 12 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index c29ffb5368b..e0b24c4be6e 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -1880,9 +1880,10 @@ void Sema::CheckFormatString(const StringLiteral *FExpr, StringRef StrRef = FExpr->getString(); const char *Str = StrRef.data(); unsigned StrLen = StrRef.size(); + const unsigned numDataArgs = TheCall->getNumArgs() - firstDataArg; // CHECK: empty format string? - if (StrLen == 0) { + if (StrLen == 0 && numDataArgs > 0) { Diag(FExpr->getLocStart(), diag::warn_empty_format_string) << OrigFormatExpr->getSourceRange(); return; @@ -1890,18 +1891,16 @@ void Sema::CheckFormatString(const StringLiteral *FExpr, if (isPrintf) { CheckPrintfHandler H(*this, FExpr, OrigFormatExpr, firstDataArg, - TheCall->getNumArgs() - firstDataArg, - isa<ObjCStringLiteral>(OrigFormatExpr), Str, - HasVAListArg, TheCall, format_idx); + numDataArgs, isa<ObjCStringLiteral>(OrigFormatExpr), + Str, HasVAListArg, TheCall, format_idx); if (!analyze_format_string::ParsePrintfString(H, Str, Str + StrLen)) H.DoneProcessing(); } else { CheckScanfHandler H(*this, FExpr, OrigFormatExpr, firstDataArg, - TheCall->getNumArgs() - firstDataArg, - isa<ObjCStringLiteral>(OrigFormatExpr), Str, - HasVAListArg, TheCall, format_idx); + numDataArgs, isa<ObjCStringLiteral>(OrigFormatExpr), + Str, HasVAListArg, TheCall, format_idx); if (!analyze_format_string::ParseScanfString(H, Str, Str + StrLen)) H.DoneProcessing(); diff --git a/clang/test/Sema/format-strings.c b/clang/test/Sema/format-strings.c index 20c665b978b..6b5f7e2c266 100644 --- a/clang/test/Sema/format-strings.c +++ b/clang/test/Sema/format-strings.c @@ -87,7 +87,12 @@ void check_empty_format_string(char* buf, ...) va_list ap; va_start(ap,buf); vprintf("",ap); // expected-warning {{format string is empty}} - sprintf(buf,""); // expected-warning {{format string is empty}} + sprintf(buf, "", 1); // expected-warning {{format string is empty}} + + // Don't warn about empty format strings when there are no data arguments. + // This can arise from macro expansions and non-standard format string + // functions. + sprintf(buf, ""); // no-warning } void check_wide_string(char* b, ...) |