diff options
author | Anders Carlsson <andersca@mac.com> | 2009-06-28 19:55:58 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-06-28 19:55:58 +0000 |
commit | d966a55bccae13f34d18958877c5e71dd643a125 (patch) | |
tree | d5071b0aa53443bec5655d8d1265f3df3b9b364d | |
parent | ae0b24376708657a16ff57227241ea86dc4f062b (diff) |
Move the check for vprintf* functions inside of SemaCheckStringLiteral. Fixes PR4470.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74413 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 47 | ||||
-rw-r--r-- | test/Sema/format-attr-pr4470.c | 11 |
2 files changed, 33 insertions, 25 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index f6d6623f9a..4f0553de7c 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -717,8 +717,6 @@ bool Sema::SemaCheckStringLiteral(const Expr *E, const CallExpr *TheCall, if (E->isTypeDependent() || E->isValueDependent()) return false; - E = E->IgnoreParenCasts(); - switch (E->getStmtClass()) { case Stmt::ConditionalOperatorClass: { const ConditionalOperator *C = cast<ConditionalOperator>(E); @@ -763,6 +761,28 @@ bool Sema::SemaCheckStringLiteral(const Expr *E, const CallExpr *TheCall, return SemaCheckStringLiteral(Init, TheCall, HasVAListArg, format_idx, firstDataArg); } + + // For vprintf* functions (i.e., HasVAListArg==true), we add a + // special check to see if the format string is a function parameter + // of the function calling the printf function. If the function + // has an attribute indicating it is a printf-like function, then we + // should suppress warnings concerning non-literals being used in a call + // to a vprintf function. For example: + // + // void + // logmessage(char const *fmt __attribute__ (format (printf, 1, 2)), ...){ + // va_list ap; + // va_start(ap, fmt); + // vprintf(fmt, ap); // Do NOT emit a warning about "fmt". + // ... + // + // + // FIXME: We don't have full attribute support yet, so just check to see + // if the argument is a DeclRefExpr that references a parameter. We'll + // add proper support for checking the attribute later. + if (HasVAListArg) + if (isa<ParmVarDecl>(VD)) + return true; } return false; @@ -901,29 +921,6 @@ Sema::CheckPrintfArguments(const CallExpr *TheCall, bool HasVAListArg, firstDataArg)) return; // Literal format string found, check done! - // For vprintf* functions (i.e., HasVAListArg==true), we add a - // special check to see if the format string is a function parameter - // of the function calling the printf function. If the function - // has an attribute indicating it is a printf-like function, then we - // should suppress warnings concerning non-literals being used in a call - // to a vprintf function. For example: - // - // void - // logmessage(char const *fmt __attribute__ (format (printf, 1, 2)), ...) { - // va_list ap; - // va_start(ap, fmt); - // vprintf(fmt, ap); // Do NOT emit a warning about "fmt". - // ... - // - // - // FIXME: We don't have full attribute support yet, so just check to see - // if the argument is a DeclRefExpr that references a parameter. We'll - // add proper support for checking the attribute later. - if (HasVAListArg) - if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(OrigFormatExpr)) - if (isa<ParmVarDecl>(DR->getDecl())) - return; - // If there are no arguments specified, warn with -Wformat-security, otherwise // warn only with -Wformat-nonliteral. if (TheCall->getNumArgs() == format_idx+1) diff --git a/test/Sema/format-attr-pr4470.c b/test/Sema/format-attr-pr4470.c new file mode 100644 index 0000000000..cba3adf1d6 --- /dev/null +++ b/test/Sema/format-attr-pr4470.c @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify -Wformat=2 %s + +#include <stdio.h> + +const char *foo(const char *format) __attribute__((format_arg(1))); + +void __attribute__((format(printf, 1, 0))) +foo2(const char *fmt, va_list va) +{ + vprintf(foo(fmt), va); +} |