14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H 15 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H 27 template <
typename ImplClass,
typename RetTy =
void>
class SValVisitor {
30 #define DISPATCH(NAME, CLASS) \ 31 return static_cast<ImplClass *>(this)->Visit ## NAME(V.castAs<CLASS>()) 37 #define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: DISPATCH(Id, Id); 38 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" 41 #define LOC_SVAL(Id, Parent) \ 42 case loc::Id ## Kind: DISPATCH(Loc ## Id, loc :: Id); 43 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" 45 llvm_unreachable(
"Unknown Loc sub-kind!");
46 case SVal::NonLocKind:
48 #define NONLOC_SVAL(Id, Parent) \ 49 case nonloc::Id ## Kind: DISPATCH(NonLoc ## Id, nonloc :: Id); 50 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" 52 llvm_unreachable(
"Unknown NonLoc sub-kind!");
54 llvm_unreachable(
"Unknown SVal kind!");
57 #define BASIC_SVAL(Id, Parent) \ 58 RetTy Visit ## Id(Id V) { DISPATCH(Parent, Id); } 59 #define ABSTRACT_SVAL(Id, Parent) \ 60 BASIC_SVAL(Id, Parent) 61 #define LOC_SVAL(Id, Parent) \ 62 RetTy VisitLoc ## Id(loc::Id V) { DISPATCH(Parent, Parent); } 63 #define NONLOC_SVAL(Id, Parent) \ 64 RetTy VisitNonLoc ## Id(nonloc::Id V) { DISPATCH(Parent, Parent); } 65 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" 78 #define DISPATCH(CLASS) \ 79 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(S)) 84 #define SYMBOL(Id, Parent) \ 85 case SymExpr::Id ## Kind: DISPATCH(Id); 86 #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" 88 llvm_unreachable(
"Unknown SymExpr kind!");
93 #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { DISPATCH(Parent); } 94 #define ABSTRACT_SYMBOL(Id, Parent) SYMBOL(Id, Parent) 95 #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" 108 #define DISPATCH(CLASS) \ 109 return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(R)) 114 #define REGION(Id, Parent) case MemRegion::Id ## Kind: DISPATCH(Id); 115 #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" 117 llvm_unreachable(
"Unknown MemRegion kind!");
122 #define REGION(Id, Parent) \ 123 RetTy Visit ## Id(const Id *R) { DISPATCH(Parent); } 124 #define ABSTRACT_REGION(Id, Parent) \ 126 #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" 136 template <
typename ImplClass,
typename RetTy =
void>
MemRegion - The root abstract class for all memory regions.
MemRegionVisitor - this class implements a simple visitor for MemRegion subclasses.
FullSValVisitor - a convenient mixed visitor for all three: SVal, SymExpr and MemRegion subclasses...
SymExprVisitor - this class implements a simple visitor for SymExpr subclasses.
RetTy VisitMemRegion(const MemRegion *R)
unsigned getSubKind() const
RetTy Visit(const MemRegion *R)
RetTy VisitSymExpr(SymbolRef S)
SValVisitor - this class implements a simple visitor for SVal subclasses.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value...
BaseKind getBaseKind() const
Dataflow Directional Tag Classes.