forked from OSchip/llvm-project
parent
d665807901
commit
0036b19abd
|
@ -1,166 +0,0 @@
|
|||
//== Checker.h - Abstract interface for checkers -----------------*- C++ -*--=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines Checker and CheckerVisitor, classes used for creating
|
||||
// domain-specific checks.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_GR_CHECKER
|
||||
#define LLVM_CLANG_GR_CHECKER
|
||||
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Checker interface.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace clang {
|
||||
|
||||
namespace ento {
|
||||
|
||||
class Checker {
|
||||
private:
|
||||
friend class ExprEngine;
|
||||
|
||||
// FIXME: Remove the 'tag' option.
|
||||
void GR_Visit(ExplodedNodeSet &Dst,
|
||||
StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng,
|
||||
const Stmt *S,
|
||||
ExplodedNode *Pred, void *tag, bool isPrevisit,
|
||||
bool& respondsToCallback) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag,
|
||||
isPrevisit ? ProgramPoint::PreStmtKind :
|
||||
ProgramPoint::PostStmtKind, &respondsToCallback, S);
|
||||
if (isPrevisit)
|
||||
_PreVisit(C, S);
|
||||
else
|
||||
_PostVisit(C, S);
|
||||
}
|
||||
|
||||
void GR_visitObjCMessage(ExplodedNodeSet &Dst,
|
||||
StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng,
|
||||
const ObjCMessage &msg,
|
||||
ExplodedNode *Pred, void *tag, bool isPrevisit) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag,
|
||||
isPrevisit ? ProgramPoint::PreStmtKind :
|
||||
ProgramPoint::PostStmtKind, 0, msg.getOriginExpr());
|
||||
if (isPrevisit)
|
||||
preVisitObjCMessage(C, msg);
|
||||
else
|
||||
postVisitObjCMessage(C, msg);
|
||||
}
|
||||
|
||||
bool GR_evalNilReceiver(ExplodedNodeSet &Dst, StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng, const ObjCMessage &msg,
|
||||
ExplodedNode *Pred, const GRState *state, void *tag) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag, ProgramPoint::PostStmtKind,
|
||||
0, msg.getOriginExpr(), state);
|
||||
return evalNilReceiver(C, msg);
|
||||
}
|
||||
|
||||
bool GR_evalCallExpr(ExplodedNodeSet &Dst, StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng, const CallExpr *CE,
|
||||
ExplodedNode *Pred, void *tag) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag, ProgramPoint::PostStmtKind,
|
||||
0, CE);
|
||||
return evalCallExpr(C, CE);
|
||||
}
|
||||
|
||||
// FIXME: Remove the 'tag' option.
|
||||
void GR_VisitBind(ExplodedNodeSet &Dst,
|
||||
StmtNodeBuilder &Builder, ExprEngine &Eng,
|
||||
const Stmt *StoreE, ExplodedNode *Pred, void *tag,
|
||||
SVal location, SVal val,
|
||||
bool isPrevisit) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag,
|
||||
isPrevisit ? ProgramPoint::PreStmtKind :
|
||||
ProgramPoint::PostStmtKind, 0, StoreE);
|
||||
assert(isPrevisit && "Only previsit supported for now.");
|
||||
PreVisitBind(C, StoreE, location, val);
|
||||
}
|
||||
|
||||
// FIXME: Remove the 'tag' option.
|
||||
void GR_visitLocation(ExplodedNodeSet &Dst,
|
||||
StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng,
|
||||
const Stmt *S,
|
||||
ExplodedNode *Pred, const GRState *state,
|
||||
SVal location,
|
||||
void *tag, bool isLoad) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag,
|
||||
isLoad ? ProgramPoint::PreLoadKind :
|
||||
ProgramPoint::PreStoreKind, 0, S, state);
|
||||
visitLocation(C, S, location, isLoad);
|
||||
}
|
||||
|
||||
void GR_evalDeadSymbols(ExplodedNodeSet &Dst, StmtNodeBuilder &Builder,
|
||||
ExprEngine &Eng, const Stmt *S, ExplodedNode *Pred,
|
||||
SymbolReaper &SymReaper, void *tag) {
|
||||
CheckerContext C(Dst, Builder, Eng, Pred, tag,
|
||||
ProgramPoint::PostPurgeDeadSymbolsKind, 0, S);
|
||||
evalDeadSymbols(C, SymReaper);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual ~Checker();
|
||||
virtual void _PreVisit(CheckerContext &C, const Stmt *S) {}
|
||||
virtual void _PostVisit(CheckerContext &C, const Stmt *S) {}
|
||||
virtual void preVisitObjCMessage(CheckerContext &C, ObjCMessage msg) {}
|
||||
virtual void postVisitObjCMessage(CheckerContext &C, ObjCMessage msg) {}
|
||||
virtual void visitLocation(CheckerContext &C, const Stmt *S, SVal location,
|
||||
bool isLoad) {}
|
||||
virtual void PreVisitBind(CheckerContext &C, const Stmt *StoreE,
|
||||
SVal location, SVal val) {}
|
||||
virtual void evalDeadSymbols(CheckerContext &C, SymbolReaper &SymReaper) {}
|
||||
virtual void evalEndPath(EndOfFunctionNodeBuilder &B, void *tag,
|
||||
ExprEngine &Eng) {}
|
||||
|
||||
virtual void MarkLiveSymbols(const GRState *state, SymbolReaper &SymReaper) {}
|
||||
|
||||
virtual void VisitBranchCondition(BranchNodeBuilder &Builder,
|
||||
ExprEngine &Eng,
|
||||
const Stmt *Condition, void *tag) {}
|
||||
|
||||
virtual bool evalNilReceiver(CheckerContext &C, ObjCMessage msg) {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool evalCallExpr(CheckerContext &C, const CallExpr *CE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual const GRState *evalAssume(const GRState *state, SVal Cond,
|
||||
bool Assumption, bool *respondsToCallback) {
|
||||
*respondsToCallback = false;
|
||||
return state;
|
||||
}
|
||||
|
||||
virtual bool wantsRegionChangeUpdate(const GRState *state) { return false; }
|
||||
|
||||
virtual const GRState *EvalRegionChanges(const GRState *state,
|
||||
const MemRegion * const *Begin,
|
||||
const MemRegion * const *End,
|
||||
bool *respondsToCallback) {
|
||||
*respondsToCallback = false;
|
||||
return state;
|
||||
}
|
||||
|
||||
virtual void VisitEndAnalysis(ExplodedGraph &G, BugReporter &B,
|
||||
ExprEngine &Eng) {}
|
||||
};
|
||||
|
||||
} // end GR namespace
|
||||
|
||||
} // end clang namespace
|
||||
|
||||
#endif
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
//===-- CheckerVisitor.def - Metadata for CheckerVisitor ----------------*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the AST nodes accepted by the CheckerVisitor class.
|
||||
//
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#ifndef PREVISIT
|
||||
#define PREVISIT(NODE, FALLBACK)
|
||||
#endif
|
||||
|
||||
#ifndef POSTVISIT
|
||||
#define POSTVISIT(NODE, FALLBACK)
|
||||
#endif
|
||||
|
||||
PREVISIT(ArraySubscriptExpr, Stmt)
|
||||
PREVISIT(BinaryOperator, Stmt)
|
||||
PREVISIT(CallExpr, GenericCall)
|
||||
PREVISIT(CompoundAssignOperator, BinaryOperator)
|
||||
PREVISIT(CStyleCastExpr, CastExpr)
|
||||
PREVISIT(CXXConstCastExpr, CastExpr)
|
||||
PREVISIT(CXXDynamicCastExpr, CastExpr)
|
||||
PREVISIT(CXXFunctionalCastExpr, CastExpr)
|
||||
PREVISIT(CXXOperatorCallExpr, GenericCall)
|
||||
PREVISIT(CXXMemberCallExpr, GenericCall)
|
||||
PREVISIT(CXXReinterpretCastExpr, CastExpr)
|
||||
PREVISIT(CXXStaticCastExpr, CastExpr)
|
||||
PREVISIT(DeclStmt, Stmt)
|
||||
PREVISIT(ImplicitCastExpr, CastExpr)
|
||||
PREVISIT(ObjCAtSynchronizedStmt, Stmt)
|
||||
PREVISIT(ReturnStmt, Stmt)
|
||||
|
||||
POSTVISIT(BlockExpr, Stmt)
|
||||
POSTVISIT(BinaryOperator, Stmt)
|
||||
POSTVISIT(CallExpr, GenericCall)
|
||||
POSTVISIT(CompoundAssignOperator, BinaryOperator)
|
||||
POSTVISIT(CXXOperatorCallExpr, GenericCall)
|
||||
POSTVISIT(CXXMemberCallExpr, GenericCall)
|
||||
POSTVISIT(ObjCIvarRefExpr, Stmt)
|
||||
|
||||
#undef PREVISIT
|
||||
#undef POSTVISIT
|
|
@ -1,103 +0,0 @@
|
|||
//== CheckerVisitor.h - Abstract visitor for checkers ------------*- C++ -*--=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines CheckerVisitor.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_GR_CHECKERVISITOR
|
||||
#define LLVM_CLANG_GR_CHECKERVISITOR
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/Checker.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
namespace ento {
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Checker visitor interface. Used by subclasses of Checker to specify their
|
||||
// own checker visitor logic.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// CheckerVisitor - This class implements a simple visitor for Stmt subclasses.
|
||||
/// Since Expr derives from Stmt, this also includes support for visiting Exprs.
|
||||
template<typename ImplClass>
|
||||
class CheckerVisitor : public Checker {
|
||||
public:
|
||||
virtual void _PreVisit(CheckerContext &C, const Stmt *S) {
|
||||
PreVisit(C, S);
|
||||
}
|
||||
|
||||
virtual void _PostVisit(CheckerContext &C, const Stmt *S) {
|
||||
PostVisit(C, S);
|
||||
}
|
||||
|
||||
void PreVisit(CheckerContext &C, const Stmt *S) {
|
||||
switch (S->getStmtClass()) {
|
||||
default:
|
||||
assert(false && "Unsupport statement.");
|
||||
return;
|
||||
|
||||
#define PREVISIT(NAME, FALLBACK) \
|
||||
case Stmt::NAME ## Class:\
|
||||
static_cast<ImplClass*>(this)->PreVisit ## NAME(C,static_cast<const NAME*>(S));\
|
||||
break;
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.def"
|
||||
}
|
||||
}
|
||||
|
||||
void PostVisit(CheckerContext &C, const Stmt *S) {
|
||||
switch (S->getStmtClass()) {
|
||||
default:
|
||||
assert(false && "Unsupport statement.");
|
||||
return;
|
||||
|
||||
#define POSTVISIT(NAME, FALLBACK) \
|
||||
case Stmt::NAME ## Class:\
|
||||
static_cast<ImplClass*>(this)->\
|
||||
PostVisit ## NAME(C,static_cast<const NAME*>(S));\
|
||||
break;
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.def"
|
||||
}
|
||||
}
|
||||
|
||||
void PreVisitGenericCall(CheckerContext &C, const CallExpr *CE) {
|
||||
static_cast<ImplClass*>(this)->PreVisitStmt(C, CE);
|
||||
}
|
||||
void PostVisitGenericCall(CheckerContext &C, const CallExpr *CE) {
|
||||
static_cast<ImplClass*>(this)->PostVisitStmt(C, CE);
|
||||
}
|
||||
|
||||
void PreVisitStmt(CheckerContext &C, const Stmt *S) {
|
||||
*C.respondsToCallback = false;
|
||||
}
|
||||
|
||||
void PostVisitStmt(CheckerContext &C, const Stmt *S) {
|
||||
*C.respondsToCallback = false;
|
||||
}
|
||||
|
||||
void PreVisitCastExpr(CheckerContext &C, const CastExpr *E) {
|
||||
static_cast<ImplClass*>(this)->PreVisitStmt(C, E);
|
||||
}
|
||||
|
||||
#define PREVISIT(NAME, FALLBACK) \
|
||||
void PreVisit ## NAME(CheckerContext &C, const NAME* S) {\
|
||||
static_cast<ImplClass*>(this)->PreVisit ## FALLBACK(C, S);\
|
||||
}
|
||||
#define POSTVISIT(NAME, FALLBACK) \
|
||||
void PostVisit ## NAME(CheckerContext &C, const NAME* S) {\
|
||||
static_cast<ImplClass*>(this)->PostVisit ## FALLBACK(C, S);\
|
||||
}
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.def"
|
||||
};
|
||||
|
||||
} // end GR namespace
|
||||
|
||||
} // end clang namespace
|
||||
|
||||
#endif
|
|
@ -18,7 +18,6 @@
|
|||
#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngineBuilders.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/Checker.h"
|
||||
#include "clang/AST/CharUnits.h"
|
||||
#include "clang/AST/ParentMap.h"
|
||||
#include "clang/AST/StmtObjC.h"
|
||||
|
|
|
@ -11,7 +11,7 @@ add_clang_library(clangStaticAnalyzerCore
|
|||
BugReporter.cpp
|
||||
BugReporterVisitors.cpp
|
||||
CFRefCount.cpp
|
||||
Checker.cpp
|
||||
CheckerContext.cpp
|
||||
CheckerHelpers.cpp
|
||||
CheckerManager.cpp
|
||||
Environment.cpp
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//== Checker.h - Abstract interface for checkers -----------------*- C++ -*--=//
|
||||
//== CheckerContext.cpp - Context info for path-sensitive checkers-----------=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -7,17 +7,15 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines Checker and CheckerVisitor, classes used for creating
|
||||
// domain-specific checks.
|
||||
// This file defines CheckerContext that provides contextual info for
|
||||
// path-sensitive checkers.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/Checker.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
|
||||
using namespace clang;
|
||||
using namespace ento;
|
||||
|
||||
Checker::~Checker() {}
|
||||
|
||||
CheckerContext::~CheckerContext() {
|
||||
// Do we need to autotransition? 'Dst' can get populated in a variety of
|
||||
// ways, including 'addTransition()' adding the predecessor node to Dst
|
|
@ -15,7 +15,6 @@
|
|||
#include "SimpleConstraintManager.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/GRState.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/Checker.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
|
Loading…
Reference in New Issue