]> granicus.if.org Git - clang/commitdiff
Hook up warning for an incomplete scanlist in scanf format strings.
authorTed Kremenek <kremenek@apple.com>
Fri, 16 Jul 2010 18:28:03 +0000 (18:28 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 16 Jul 2010 18:28:03 +0000 (18:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108542 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Analysis/ScanfFormatString.cpp
lib/Sema/SemaChecking.cpp
test/Sema/format-strings-scanf.c

index 9dac3f242212f59d9947bcbb790474d8dbe46f9a..b88480dc69d67d58c85b88ad27bcc52d449d2e32 100644 (file)
@@ -2985,7 +2985,7 @@ def warn_printf_ignored_flag: Warning<
   "flag '%0' is ignored when flag '%1' is present">,
   InGroup<Format>;
 def warn_scanf_scanlist_incomplete : Warning<
-  "scanlist not terminated in format string">,
+  "no closing ‘]’ for ‘%%[’ in scanf format string">,
   InGroup<Format>;
   
 // CHECK: returning address/reference of stack memory
index 1fa4faea18073cce67e3760463e27fa4b46159e8..a5fe77ddd889cc24bf45fce60b302cafb1c18825 100644 (file)
@@ -41,7 +41,7 @@ static bool ParseScanList(FormatStringHandler &H,
   // Special case: ']' is the first character.
   if (*I == ']') {
     if (++I == E) {
-      H.HandleIncompleteScanList(start, I);
+      H.HandleIncompleteScanList(start, I - 1);
       return true;
     }
   }
@@ -49,7 +49,7 @@ static bool ParseScanList(FormatStringHandler &H,
   // Look for a ']' character which denotes the end of the scan list.
   while (*I != ']') {
     if (++I == E) {
-      H.HandleIncompleteScanList(start, I);
+      H.HandleIncompleteScanList(start, I - 1);
       return true;
     }
   }    
index d789730715eee4eb6394e7ce7a51a0d09eecfe87..370d3503298e89b9254780a8bda689d94374d02d 100644 (file)
@@ -1617,9 +1617,17 @@ public:
   bool HandleScanfSpecifier(const analyze_scanf::ScanfSpecifier &FS,
                             const char *startSpecifier,
                             unsigned specifierLen);
+
+  void HandleIncompleteScanList(const char *start, const char *end);
 };
 }
 
+void CheckScanfHandler::HandleIncompleteScanList(const char *start,
+                                                 const char *end) {
+  S.Diag(getLocationOfByte(end), diag::warn_scanf_scanlist_incomplete)
+    << getSpecifierRange(start, end - start);
+}
+
 bool CheckScanfHandler::HandleScanfSpecifier(
                                        const analyze_scanf::ScanfSpecifier &FS,
                                        const char *startSpecifier,
index 63e81d4c7428fac9a9c49a2b5876b1d884188563..f5718868776ca8102787bc68685dc36e090f9fd6 100644 (file)
@@ -11,4 +11,5 @@ void test(const char *s, int *i) {
   scanf(s, i); // expected-warning{{ormat string is not a string literal}}
   scanf("%0d", i); // expected-warning{{zero field width in scanf format string is unused}}
   scanf("%00d", i); // expected-warning{{zero field width in scanf format string is unused}}
+  scanf("%d%[asdfasdfd", i, s); // expected-warning{{no closing ‘]’ for ‘%[’ in scanf format string}}
 }