forked from OSchip/llvm-project
[analyzer] isCLibraryFunction: check that the function is at TU-scope.
Also, Decls already carry a pointer to the ASTContext, so there's no need to pass an extra argument to the predicate. llvm-svn: 167337
This commit is contained in:
parent
8ed46b9935
commit
0da6747901
|
@ -212,11 +212,9 @@ public:
|
|||
return getCalleeName(FunDecl);
|
||||
}
|
||||
|
||||
/// Given a function declaration and a name checks if this is a C lib
|
||||
/// function with the given name.
|
||||
bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name);
|
||||
static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name,
|
||||
ASTContext &Context);
|
||||
/// \brief Returns true if the given function is the specified built-in or
|
||||
/// system library C function.
|
||||
static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name);
|
||||
|
||||
/// \brief Depending on wither the location corresponds to a macro, return
|
||||
/// either the macro name or the token spelling.
|
||||
|
|
|
@ -33,7 +33,6 @@ namespace {
|
|||
class WalkAST: public StmtVisitor<WalkAST> {
|
||||
BugReporter &BR;
|
||||
AnalysisDeclContext* AC;
|
||||
ASTContext &ASTC;
|
||||
|
||||
/// Check if two expressions refer to the same declaration.
|
||||
inline bool sameDecl(const Expr *A1, const Expr *A2) {
|
||||
|
@ -58,8 +57,8 @@ class WalkAST: public StmtVisitor<WalkAST> {
|
|||
const FunctionDecl *FD = CE->getDirectCallee();
|
||||
if (!FD)
|
||||
return false;
|
||||
return (CheckerContext::isCLibraryFunction(FD, "strlen", ASTC)
|
||||
&& sameDecl(CE->getArg(0), WithArg));
|
||||
return (CheckerContext::isCLibraryFunction(FD, "strlen") &&
|
||||
sameDecl(CE->getArg(0), WithArg));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -83,7 +82,7 @@ class WalkAST: public StmtVisitor<WalkAST> {
|
|||
|
||||
public:
|
||||
WalkAST(BugReporter &br, AnalysisDeclContext* ac) :
|
||||
BR(br), AC(ac), ASTC(AC->getASTContext()) {
|
||||
BR(br), AC(ac) {
|
||||
}
|
||||
|
||||
// Statement visitor methods.
|
||||
|
@ -136,7 +135,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
|
|||
if (!FD)
|
||||
return;
|
||||
|
||||
if (CheckerContext::isCLibraryFunction(FD, "strncat", ASTC)) {
|
||||
if (CheckerContext::isCLibraryFunction(FD, "strncat")) {
|
||||
if (containsBadStrncatPattern(CE)) {
|
||||
const Expr *DstArg = CE->getArg(0);
|
||||
const Expr *LenArg = CE->getArg(2);
|
||||
|
|
|
@ -38,17 +38,12 @@ StringRef CheckerContext::getCalleeName(const FunctionDecl *FunDecl) const {
|
|||
|
||||
bool CheckerContext::isCLibraryFunction(const FunctionDecl *FD,
|
||||
StringRef Name) {
|
||||
return isCLibraryFunction(FD, Name, getASTContext());
|
||||
}
|
||||
|
||||
bool CheckerContext::isCLibraryFunction(const FunctionDecl *FD,
|
||||
StringRef Name, ASTContext &Context) {
|
||||
// To avoid false positives (Ex: finding user defined functions with
|
||||
// similar names), only perform fuzzy name matching when it's a builtin.
|
||||
// Using a string compare is slow, we might want to switch on BuiltinID here.
|
||||
unsigned BId = FD->getBuiltinID();
|
||||
if (BId != 0) {
|
||||
StringRef BName = Context.BuiltinInfo.GetName(BId);
|
||||
StringRef BName = FD->getASTContext().BuiltinInfo.GetName(BId);
|
||||
if (BName.find(Name) != StringRef::npos)
|
||||
return true;
|
||||
}
|
||||
|
@ -59,6 +54,19 @@ bool CheckerContext::isCLibraryFunction(const FunctionDecl *FD,
|
|||
if (!II)
|
||||
return false;
|
||||
|
||||
// Look through 'extern "C"' and anything similar invented in the future.
|
||||
const DeclContext *DC = FD->getDeclContext();
|
||||
while (DC->isTransparentContext())
|
||||
DC = DC->getParent();
|
||||
|
||||
// If this function is in a namespace, it is not a C library function.
|
||||
if (!DC->isTranslationUnit())
|
||||
return false;
|
||||
|
||||
// If this function is not externally visible, it is not a C library function.
|
||||
if (FD->getLinkage() != ExternalLinkage)
|
||||
return false;
|
||||
|
||||
StringRef FName = II->getName();
|
||||
if (FName.equals(Name))
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue