14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGREPORTERVISITORS_H 15 #define LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGREPORTERVISITORS_H 21 #include "llvm/ADT/FoldingSet.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/ADT/StringRef.h" 37 class BugReporterContext;
40 class PathDiagnosticPiece;
60 virtual std::shared_ptr<PathDiagnosticPiece>
61 VisitNode(
const ExplodedNode *Succ,
62 BugReporterContext &BRC, BugReport &BR) = 0;
66 virtual void finalizeVisitor(BugReporterContext &BRC,
67 const ExplodedNode *EndPathNode,
75 virtual std::shared_ptr<PathDiagnosticPiece>
76 getEndPath(BugReporterContext &BRC,
const ExplodedNode *N, BugReport &BR);
78 virtual void Profile(llvm::FoldingSetNodeID &
ID)
const = 0;
81 static std::shared_ptr<PathDiagnosticPiece>
82 getDefaultEndPath(BugReporterContext &BRC,
const ExplodedNode *N,
91 bool Satisfied =
false;
95 bool EnableNullFPSuppression;
100 static void registerStatementVarDecls(BugReport &BR,
const Stmt *S,
101 bool EnableNullFPSuppression);
103 FindLastStoreBRVisitor(KnownSVal V,
const MemRegion *R,
104 bool InEnableNullFPSuppression)
105 : R(R), V(V), EnableNullFPSuppression(InEnableNullFPSuppression) {}
107 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
109 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
110 BugReporterContext &BRC,
111 BugReport &BR)
override;
115 DefinedSVal Constraint;
117 bool IsSatisfied =
false;
122 bool IsTrackingTurnedOn =
false;
125 TrackConstraintBRVisitor(DefinedSVal constraint,
bool assumption)
126 : Constraint(constraint), Assumption(assumption),
127 IsZeroCheck(!Assumption && Constraint.getAs<Loc>()) {}
129 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
133 static const char *getTag();
135 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
136 BugReporterContext &BRC,
137 BugReport &BR)
override;
141 bool isUnderconstrained(
const ExplodedNode *N)
const;
148 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
153 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
154 BugReporterContext &BRC,
155 BugReport &BR)
override;
159 static const Expr *getNilReceiver(
const Stmt *S,
const ExplodedNode *N);
165 static const char *
const GenericTrueMessage;
166 static const char *
const GenericFalseMessage;
169 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
176 static const char *getTag();
178 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
179 BugReporterContext &BRC,
180 BugReport &BR)
override;
182 std::shared_ptr<PathDiagnosticPiece> VisitNodeImpl(
const ExplodedNode *N,
183 BugReporterContext &BRC,
186 std::shared_ptr<PathDiagnosticPiece>
187 VisitTerminator(
const Stmt *Term,
const ExplodedNode *N,
188 const CFGBlock *srcBlk,
const CFGBlock *dstBlk, BugReport &R,
189 BugReporterContext &BRC);
191 std::shared_ptr<PathDiagnosticPiece>
192 VisitTrueTest(
const Expr *Cond, BugReporterContext &BRC, BugReport &R,
193 const ExplodedNode *N,
bool TookTrue);
195 std::shared_ptr<PathDiagnosticPiece>
196 VisitTrueTest(
const Expr *Cond,
const DeclRefExpr *DR,
197 BugReporterContext &BRC, BugReport &R,
const ExplodedNode *N,
198 bool TookTrue,
bool IsAssuming);
200 std::shared_ptr<PathDiagnosticPiece>
201 VisitTrueTest(
const Expr *Cond,
const BinaryOperator *BExpr,
202 BugReporterContext &BRC, BugReport &R,
const ExplodedNode *N,
203 bool TookTrue,
bool IsAssuming);
205 std::shared_ptr<PathDiagnosticPiece>
206 VisitTrueTest(
const Expr *Cond,
const MemberExpr *ME, BugReporterContext &BRC,
207 BugReport &R,
const ExplodedNode *N,
bool TookTrue,
210 std::shared_ptr<PathDiagnosticPiece>
211 VisitConditionVariable(StringRef LhsString,
const Expr *CondVarExpr,
212 BugReporterContext &BRC, BugReport &R,
213 const ExplodedNode *N,
bool TookTrue);
224 bool printValue(
const Expr *CondVarExpr, raw_ostream &Out,
225 const ExplodedNode *N,
bool TookTrue,
bool IsAssuming);
227 bool patternMatch(
const Expr *Ex,
228 const Expr *ParentEx,
230 BugReporterContext &BRC,
232 const ExplodedNode *N,
233 Optional<bool> &prunable,
234 bool IsSameFieldName);
236 static bool isPieceMessageGeneric(
const PathDiagnosticPiece *Piece);
242 class LikelyFalsePositiveSuppressionBRVisitor final
245 static void *getTag() {
247 return static_cast<void *
>(&Tag);
250 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
251 ID.AddPointer(getTag());
254 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *,
255 BugReporterContext &,
256 BugReport &)
override {
260 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *N,
261 BugReport &BR)
override;
274 UndefOrNullArgVisitor(
const MemRegion *InR) : R(InR) {}
276 void Profile(llvm::FoldingSetNodeID &ID)
const override {
282 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
283 BugReporterContext &BRC,
284 BugReport &BR)
override;
293 bool IsSatisfied =
false;
300 bool IsTrackingTurnedOn =
false;
303 SuppressInlineDefensiveChecksVisitor(DefinedSVal Val,
const ExplodedNode *N);
305 void Profile(llvm::FoldingSetNodeID &ID)
const override;
309 static const char *getTag();
311 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *Succ,
312 BugReporterContext &BRC,
313 BugReport &BR)
override;
325 FalsePositiveRefutationBRVisitor();
327 void Profile(llvm::FoldingSetNodeID &ID)
const override;
329 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
330 BugReporterContext &BRC,
331 BugReport &BR)
override;
333 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *EndPathNode,
334 BugReport &BR)
override;
341 void Profile(llvm::FoldingSetNodeID &ID)
const override;
343 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
344 BugReporterContext &BRC,
345 BugReport &R)
override;
348 namespace bugreporter {
362 bool trackExpressionValue(
const ExplodedNode *N,
const Expr *E, BugReport &R,
363 bool EnableNullFPSuppression =
true);
365 const Expr *getDerefExpr(
const Stmt *S);
373 #endif // LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGREPORTERVISITORS_H
llvm::ImmutableMap< SymbolRef, RangeSet > ConstraintRangeTy
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
Dataflow Directional Tag Classes.