/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValVisitor.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- SValVisitor.h - Visitor for SVal subclasses ------------*- C++ -*-===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // This file defines the SValVisitor, SymExprVisitor, and MemRegionVisitor |
11 | | // interfaces, and also FullSValVisitor, which visits all three hierarchies. |
12 | | // |
13 | | //===----------------------------------------------------------------------===// |
14 | | |
15 | | #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H |
16 | | #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SVALVISITOR_H |
17 | | |
18 | | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" |
19 | | #include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h" |
20 | | #include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" |
21 | | |
22 | | namespace clang { |
23 | | |
24 | | namespace ento { |
25 | | |
26 | | /// SValVisitor - this class implements a simple visitor for SVal |
27 | | /// subclasses. |
28 | | template <typename ImplClass, typename RetTy = void> class SValVisitor { |
29 | | public: |
30 | | |
31 | | #define DISPATCH(NAME, CLASS) \ |
32 | 97.6k | return static_cast<ImplClass *>(this)->Visit ## NAME(V.castAs<CLASS>()) |
33 | | |
34 | 32.5k | RetTy Visit(SVal V) { |
35 | 32.5k | // Dispatch to VisitFooVal for each FooVal. |
36 | 32.5k | // Take namespaces (loc:: and nonloc::) into account. |
37 | 32.5k | switch (V.getBaseKind()) { |
38 | 65.0k | #define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: 2 DISPATCH65.0k (Id, Id); |
39 | 32.5k | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"32.5k |
40 | 25 | case SVal::LocKind: |
41 | 25 | switch (V.getSubKind()) { |
42 | 25 | #define LOC_SVAL(Id, Parent) \ |
43 | 50 | case loc::Id ## Kind: 25 DISPATCH50 (Loc ## Id, loc :: Id); |
44 | 2 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" |
45 | 25 | } |
46 | 0 | llvm_unreachable0 ("Unknown Loc sub-kind!"); |
47 | 32.4k | case SVal::NonLocKind: |
48 | 32.4k | switch (V.getSubKind()) { |
49 | 32.4k | #define NONLOC_SVAL(Id, Parent) \ |
50 | 32.5k | case nonloc::Id ## Kind: 32.4k DISPATCH32.5k (NonLoc ## Id, nonloc :: Id); |
51 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" |
52 | 32.4k | } |
53 | 0 | llvm_unreachable("Unknown NonLoc sub-kind!"); |
54 | 32.5k | } |
55 | 0 | llvm_unreachable0 ("Unknown SVal kind!"); |
56 | 32.5k | } SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::Visit(clang::ento::SVal) Line | Count | Source | 34 | 32.4k | RetTy Visit(SVal V) { | 35 | 32.4k | // Dispatch to VisitFooVal for each FooVal. | 36 | 32.4k | // Take namespaces (loc:: and nonloc::) into account. | 37 | 32.4k | switch (V.getBaseKind()) { | 38 | 32.4k | #define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: DISPATCH(Id, Id); | 39 | 32.4k | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"32.4k | 40 | 0 | case SVal::LocKind: | 41 | 0 | switch (V.getSubKind()) { | 42 | 0 | #define LOC_SVAL(Id, Parent) \ | 43 | 0 | case loc::Id ## Kind: DISPATCH(Loc ## Id, loc :: Id); | 44 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" | 45 | 0 | } | 46 | 0 | llvm_unreachable0 ("Unknown Loc sub-kind!"); | 47 | 32.4k | case SVal::NonLocKind: | 48 | 32.4k | switch (V.getSubKind()) { | 49 | 32.4k | #define NONLOC_SVAL(Id, Parent) \ | 50 | 32.4k | case nonloc::Id ## Kind: DISPATCH(NonLoc ## Id, nonloc :: Id); | 51 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" | 52 | 32.4k | } | 53 | 0 | llvm_unreachable("Unknown NonLoc sub-kind!"); | 54 | 32.4k | } | 55 | 0 | llvm_unreachable0 ("Unknown SVal kind!"); | 56 | | } |
clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Visit(clang::ento::SVal) Line | Count | Source | 34 | 46 | RetTy Visit(SVal V) { | 35 | 46 | // Dispatch to VisitFooVal for each FooVal. | 36 | 46 | // Take namespaces (loc:: and nonloc::) into account. | 37 | 46 | switch (V.getBaseKind()) { | 38 | 46 | #define BASIC_SVAL(Id, Parent) case SVal::Id ## Kind: DISPATCH(Id, Id); | 39 | 46 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"46 | 40 | 25 | case SVal::LocKind: | 41 | 25 | switch (V.getSubKind()) { | 42 | 25 | #define LOC_SVAL(Id, Parent) \ | 43 | 25 | case loc::Id ## Kind: DISPATCH(Loc ## Id, loc :: Id); | 44 | 2 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" | 45 | 25 | } | 46 | 0 | llvm_unreachable0 ("Unknown Loc sub-kind!"); | 47 | 19 | case SVal::NonLocKind: | 48 | 19 | switch (V.getSubKind()) { | 49 | 19 | #define NONLOC_SVAL(Id, Parent) \ | 50 | 19 | case nonloc::Id ## Kind: DISPATCH(NonLoc ## Id, nonloc :: Id); | 51 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" | 52 | 19 | } | 53 | 0 | llvm_unreachable("Unknown NonLoc sub-kind!"); | 54 | 46 | } | 55 | 0 | llvm_unreachable0 ("Unknown SVal kind!"); | 56 | | } |
|
57 | | |
58 | | #define BASIC_SVAL(Id, Parent) \ |
59 | 0 | RetTy Visit ## Id(Id V) { 0 DISPATCH0 (Parent, Id); } Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitDefinedOrUnknownSVal(clang::ento::DefinedOrUnknownSVal) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitNonLoc(clang::ento::NonLoc) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitUndefinedVal(clang::ento::UndefinedVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitUnknownVal(clang::ento::UnknownVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitDefinedOrUnknownSVal(clang::ento::DefinedOrUnknownSVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitLoc(clang::ento::Loc) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitDefinedSVal(clang::ento::DefinedSVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLoc(clang::ento::NonLoc) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitLoc(clang::ento::Loc) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitDefinedSVal(clang::ento::DefinedSVal) |
60 | | #define ABSTRACT_SVAL(Id, Parent) \ |
61 | | BASIC_SVAL(Id, Parent) |
62 | | #define LOC_SVAL(Id, Parent) \ |
63 | 0 | RetTy VisitLoc ## Id(loc::Id V) { 0 DISPATCH0 (Parent, Parent); } Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitLocGotoLabel(clang::ento::loc::GotoLabel) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitLocMemRegionVal(clang::ento::loc::MemRegionVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitLocConcreteInt(clang::ento::loc::ConcreteInt) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitLocGotoLabel(clang::ento::loc::GotoLabel) |
64 | | #define NONLOC_SVAL(Id, Parent) \ |
65 | 0 | RetTy VisitNonLoc ## Id(nonloc::Id V) { 0 DISPATCH0 (Parent, Parent); } Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLocConcreteInt(clang::ento::nonloc::ConcreteInt) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitNonLocPointerToMember(clang::ento::nonloc::PointerToMember) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLocPointerToMember(clang::ento::nonloc::PointerToMember) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLocLocAsInteger(clang::ento::nonloc::LocAsInteger) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLocLazyCompoundVal(clang::ento::nonloc::LazyCompoundVal) Unexecuted instantiation: SimpleSValBuilder.cpp:clang::ento::SValVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitNonLocCompoundVal(clang::ento::nonloc::CompoundVal) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitNonLocLocAsInteger(clang::ento::nonloc::LocAsInteger) Unexecuted instantiation: clang::ento::SValVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitNonLocCompoundVal(clang::ento::nonloc::CompoundVal) |
66 | | #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def" |
67 | | |
68 | | // Base case, ignore it. :) |
69 | | RetTy VisitSVal(SVal V) { return RetTy(); } |
70 | | |
71 | | #undef DISPATCH |
72 | | }; |
73 | | |
74 | | /// SymExprVisitor - this class implements a simple visitor for SymExpr |
75 | | /// subclasses. |
76 | | template <typename ImplClass, typename RetTy = void> class SymExprVisitor { |
77 | | public: |
78 | | |
79 | | #define DISPATCH(CLASS) \ |
80 | 101k | return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(S)) |
81 | | |
82 | 34.5k | RetTy Visit(SymbolRef S) { |
83 | 34.5k | // Dispatch to VisitSymbolFoo for each SymbolFoo. |
84 | 34.5k | switch (S->getKind()) { |
85 | 34.5k | #define SYMBOL(Id, Parent) \ |
86 | 68.0k | case SymExpr::Id ## Kind: 34.5k DISPATCH68.0k (Id); |
87 | 84 | #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" |
88 | 34.5k | } |
89 | 0 | llvm_unreachable0 ("Unknown SymExpr kind!"); |
90 | 34.5k | } SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::Visit(clang::ento::SymExpr const*) Line | Count | Source | 82 | 34.4k | RetTy Visit(SymbolRef S) { | 83 | 34.4k | // Dispatch to VisitSymbolFoo for each SymbolFoo. | 84 | 34.4k | switch (S->getKind()) { | 85 | 34.4k | #define SYMBOL(Id, Parent) \ | 86 | 34.4k | case SymExpr::Id ## Kind: DISPATCH(Id); | 87 | 84 | #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" | 88 | 34.4k | } | 89 | 0 | llvm_unreachable0 ("Unknown SymExpr kind!"); | 90 | | } |
clang::ento::SymExprVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Visit(clang::ento::SymExpr const*) Line | Count | Source | 82 | 30 | RetTy Visit(SymbolRef S) { | 83 | 30 | // Dispatch to VisitSymbolFoo for each SymbolFoo. | 84 | 30 | switch (S->getKind()) { | 85 | 30 | #define SYMBOL(Id, Parent) \ | 86 | 30 | case SymExpr::Id ## Kind: DISPATCH(Id); | 87 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" | 88 | 30 | } | 89 | 0 | llvm_unreachable0 ("Unknown SymExpr kind!"); | 90 | | } |
|
91 | | |
92 | | // If the implementation chooses not to implement a certain visit method, fall |
93 | | // back on visiting the superclass. |
94 | 33.2k | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 33.2k DISPATCH33.2k (Parent); } SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolRegionValue(clang::ento::SymbolRegionValue const*) Line | Count | Source | 94 | 18.2k | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 18.2k DISPATCH18.2k (Parent); } |
SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolMetadata(clang::ento::SymbolMetadata const*) Line | Count | Source | 94 | 972 | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 972 DISPATCH972 (Parent); } |
SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolExtent(clang::ento::SymbolExtent const*) Line | Count | Source | 94 | 1.05k | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 1.05k DISPATCH1.05k (Parent); } |
Unexecuted instantiation: clang::ento::SymExprVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitBinarySymExpr(clang::ento::BinarySymExpr const*) SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolDerived(clang::ento::SymbolDerived const*) Line | Count | Source | 94 | 793 | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 793 DISPATCH793 (Parent); } |
Unexecuted instantiation: clang::ento::SymExprVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitSymbolCast(clang::ento::SymbolCast const*) SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolConjured(clang::ento::SymbolConjured const*) Line | Count | Source | 94 | 11.9k | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 11.9k DISPATCH11.9k (Parent); } |
SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitSymbolCast(clang::ento::SymbolCast const*) Line | Count | Source | 94 | 20 | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 20 DISPATCH20 (Parent); } |
SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitBinarySymExpr(clang::ento::BinarySymExpr const*) Line | Count | Source | 94 | 84 | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 84 DISPATCH84 (Parent); } |
Unexecuted instantiation: clang::ento::SymExprVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitIntSymExpr(clang::ento::IntSymExpr const*) SimpleSValBuilder.cpp:clang::ento::SymExprVisitor<(anonymous namespace)::SimpleSValBuilder::simplifySVal(llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>, clang::ento::SVal)::Simplifier, clang::ento::SVal>::VisitIntSymExpr(clang::ento::IntSymExpr const*) Line | Count | Source | 94 | 84 | #define SYMBOL(Id, Parent) RetTy Visit ## Id(const Id *S) { 84 DISPATCH84 (Parent); } |
|
95 | | #define ABSTRACT_SYMBOL(Id, Parent) SYMBOL(Id, Parent) |
96 | | #include "clang/StaticAnalyzer/Core/PathSensitive/Symbols.def" |
97 | | |
98 | | // Base case, ignore it. :) |
99 | | RetTy VisitSymExpr(SymbolRef S) { return RetTy(); } |
100 | | |
101 | | #undef DISPATCH |
102 | | }; |
103 | | |
104 | | /// MemRegionVisitor - this class implements a simple visitor for MemRegion |
105 | | /// subclasses. |
106 | | template <typename ImplClass, typename RetTy = void> class MemRegionVisitor { |
107 | | public: |
108 | | |
109 | | #define DISPATCH(CLASS) \ |
110 | 86 | return static_cast<ImplClass *>(this)->Visit ## CLASS(cast<CLASS>(R)) |
111 | | |
112 | 43 | RetTy Visit(const MemRegion *R) { |
113 | 43 | // Dispatch to VisitFooRegion for each FooRegion. |
114 | 43 | switch (R->getKind()) { |
115 | 86 | #define REGION(Id, Parent) case MemRegion::Id ## Kind: 43 DISPATCH86 (Id); |
116 | 0 | #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" |
117 | 43 | } |
118 | 0 | llvm_unreachable0 ("Unknown MemRegion kind!"); |
119 | 43 | } |
120 | | |
121 | | // If the implementation chooses not to implement a certain visit method, fall |
122 | | // back on visiting the superclass. |
123 | | #define REGION(Id, Parent) \ |
124 | 0 | RetTy Visit ## Id(const Id *R) { 0 DISPATCH0 (Parent); } Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitGlobalImmutableSpaceRegion(clang::ento::GlobalImmutableSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitMemSpaceRegion(clang::ento::MemSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitGlobalsSpaceRegion(clang::ento::GlobalsSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitGlobalInternalSpaceRegion(clang::ento::GlobalInternalSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitGlobalSystemSpaceRegion(clang::ento::GlobalSystemSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitStaticGlobalSpaceRegion(clang::ento::StaticGlobalSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitHeapSpaceRegion(clang::ento::HeapSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitStackArgumentsSpaceRegion(clang::ento::StackArgumentsSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitStackSpaceRegion(clang::ento::StackSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitStackLocalsSpaceRegion(clang::ento::StackLocalsSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitUnknownSpaceRegion(clang::ento::UnknownSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitBlockDataRegion(clang::ento::BlockDataRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitTypedRegion(clang::ento::TypedRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitSubRegion(clang::ento::SubRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitBlockCodeRegion(clang::ento::BlockCodeRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitCodeTextRegion(clang::ento::CodeTextRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitFunctionCodeRegion(clang::ento::FunctionCodeRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitCXXThisRegion(clang::ento::CXXThisRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitTypedValueRegion(clang::ento::TypedValueRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitObjCStringRegion(clang::ento::ObjCStringRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitCodeSpaceRegion(clang::ento::CodeSpaceRegion const*) Unexecuted instantiation: clang::ento::MemRegionVisitor<clang::ento::SValExplainer, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::VisitNonStaticGlobalSpaceRegion(clang::ento::NonStaticGlobalSpaceRegion const*) |
125 | | #define ABSTRACT_REGION(Id, Parent) \ |
126 | | REGION(Id, Parent) |
127 | | #include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def" |
128 | | |
129 | | // Base case, ignore it. :) |
130 | | RetTy VisitMemRegion(const MemRegion *R) { return RetTy(); } |
131 | | |
132 | | #undef DISPATCH |
133 | | }; |
134 | | |
135 | | /// FullSValVisitor - a convenient mixed visitor for all three: |
136 | | /// SVal, SymExpr and MemRegion subclasses. |
137 | | template <typename ImplClass, typename RetTy = void> |
138 | | class FullSValVisitor : public SValVisitor<ImplClass, RetTy>, |
139 | | public SymExprVisitor<ImplClass, RetTy>, |
140 | | public MemRegionVisitor<ImplClass, RetTy> { |
141 | | public: |
142 | | using SValVisitor<ImplClass, RetTy>::Visit; |
143 | | using SymExprVisitor<ImplClass, RetTy>::Visit; |
144 | | using MemRegionVisitor<ImplClass, RetTy>::Visit; |
145 | | }; |
146 | | |
147 | | } // end namespace ento |
148 | | |
149 | | } // end namespace clang |
150 | | |
151 | | #endif |