]> granicus.if.org Git - clang/commitdiff
Correctly compute the index of the first string format argument when deciding
authorEli Friedman <eli.friedman@gmail.com>
Tue, 18 Jun 2013 18:10:01 +0000 (18:10 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 18 Jun 2013 18:10:01 +0000 (18:10 +0000)
whether to emit a -Wformat-security warning.  <rdar://problem/14178260>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184214 91177308-0d34-0410-b5e6-96231b3b80d8

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

index da24667804b5d361217b613646b6ef538eca8710..c6d2362908fe0d33557960c1528feb37ef278da6 100644 (file)
@@ -1951,7 +1951,7 @@ bool Sema::CheckFormatArguments(ArrayRef<const Expr *> Args,
 
   // If there are no arguments specified, warn with -Wformat-security, otherwise
   // warn only with -Wformat-nonliteral.
-  if (Args.size() == format_idx+1)
+  if (Args.size() == firstDataArg)
     Diag(Args[format_idx]->getLocStart(),
          diag::warn_format_nonliteral_noargs)
       << OrigFormatExpr->getSourceRange();
index ba1272148973fb5384cc33c8be9920f8583568bd..6da027e02c6502eec21934ba1d859959fe6bd70a 100644 (file)
@@ -591,3 +591,13 @@ void test_qualifiers(volatile int *vip, const int *cip,
   printf("%n", (ip_t)0); // No warning.
   printf("%n", (cip_t)0); // expected-warning{{format specifies type 'int *' but the argument has type 'cip_t' (aka 'const int *')}}
 }
+
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#pragma GCC diagnostic warning "-Wformat-security"
+// <rdar://problem/14178260>
+extern void test_format_security_extra_args(const char*, int, ...)
+    __attribute__((__format__(__printf__, 1, 3)));
+void test_format_security_pos(char* string) {
+  test_format_security_extra_args(string, 5); // expected-warning {{format string is not a string literal (potentially insecure)}}
+}
+#pragma GCC diagnostic warning "-Wformat-nonliteral"