]> granicus.if.org Git - clang/commitdiff
Do not warn about empty format strings when there are no data arguments. Fixes ...
authorTed Kremenek <kremenek@apple.com>
Thu, 29 Sep 2011 05:52:16 +0000 (05:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 29 Sep 2011 05:52:16 +0000 (05:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140777 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/Sema/format-strings.c

index c29ffb5368baff6d9e00d6f51afd72e549bc206e..e0b24c4be6ebacaa08c8b00d6f0115bb71f4023d 100644 (file)
@@ -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();
index 20c665b978be6743d2f9e42030df30d869baa0bb..6b5f7e2c26623deb904815b42d5d44291c442c5b 100644 (file)
@@ -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, ...)