From: Ted Kremenek Date: Fri, 10 Feb 2012 19:13:51 +0000 (+0000) Subject: Enhance checking for null format string literal to take into account __null. Fixes... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e3d8e737e18f0ce95d87be03f74b35413443173c;p=clang Enhance checking for null format string literal to take into account __null. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150260 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index a44633d5d7..be326880d5 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -1381,6 +1381,7 @@ bool Sema::SemaCheckStringLiteral(const Expr *E, Expr **Args, inFunctionCall); } + case Stmt::GNUNullExprClass: case Stmt::IntegerLiteralClass: // Technically -Wformat-nonliteral does not warn about this case. // The behavior of printf and friends in this case is implementation diff --git a/test/SemaCXX/format-strings.cpp b/test/SemaCXX/format-strings.cpp index 8b0b00d04e..456167dfc9 100644 --- a/test/SemaCXX/format-strings.cpp +++ b/test/SemaCXX/format-strings.cpp @@ -39,3 +39,14 @@ void h(int *i) { printf(foo.gettext("%d"), i); // expected-warning{{format specifies type 'int' but the argument has type 'int *'}} printf(Foo::gettext_static("%d"), i); // expected-warning{{format specifies type 'int' but the argument has type 'int *'}} } + +// Test handling __null for format string literal checking. +extern "C" { + int test_null_format(const char *format, ...) __attribute__((__format__ (__printf__, 1, 2))); +} + +void rdar8269537(const char *f) +{ + test_null_format(__null); // no-warning + test_null_format(f); // expected-warning {{not a string literal}} +}