Don't warn about using PredefinedExprs as format string literals. These never can be a real security issue.

Fixes PR 9314.

llvm-svn: 126447
This commit is contained in:
Ted Kremenek 2011-02-24 23:03:04 +00:00
parent 27361a7124
commit a8890833f2
2 changed files with 15 additions and 1 deletions

View File

@ -875,7 +875,7 @@ bool Sema::SemaBuiltinLongjmp(CallExpr *TheCall) {
return false;
}
// Handle i > 1 ? "x" : "y", recursivelly
// Handle i > 1 ? "x" : "y", recursively.
bool Sema::SemaCheckStringLiteral(const Expr *E, const CallExpr *TheCall,
bool HasVAListArg,
unsigned format_idx, unsigned firstDataArg,
@ -918,6 +918,12 @@ bool Sema::SemaCheckStringLiteral(const Expr *E, const CallExpr *TheCall,
}
return false;
case Stmt::PredefinedExprClass:
// While __func__, etc., are technically not string literals, they
// cannot contain format specifiers and thus are not a security
// liability.
return true;
case Stmt::DeclRefExprClass: {
const DeclRefExpr *DR = cast<DeclRefExpr>(E);

View File

@ -350,3 +350,11 @@ void posix_extensions() {
void pr8486() {
printf("%s", 1); // expected-warning{{conversion specifies type 'char *' but the argument has type 'int'}}
}
// PR9314
// Don't warn about string literals that are PreDefinedExprs, e.g. __func__.
void pr9314() {
printf(__PRETTY_FUNCTION__); // no-warning
printf(__func__); // no-warning
}