15 #ifndef LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGREPORTERVISITORS_H 16 #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,
const ExplodedNode *Pred,
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,
89 bool Satisfied =
false;
93 bool EnableNullFPSuppression;
98 static void registerStatementVarDecls(BugReport &BR,
const Stmt *S,
99 bool EnableNullFPSuppression);
101 FindLastStoreBRVisitor(KnownSVal V,
const MemRegion *R,
102 bool InEnableNullFPSuppression)
103 : R(R), V(V), EnableNullFPSuppression(InEnableNullFPSuppression) {}
105 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
107 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
108 const ExplodedNode *PrevN,
109 BugReporterContext &BRC,
110 BugReport &BR)
override;
114 DefinedSVal Constraint;
116 bool IsSatisfied =
false;
121 bool IsTrackingTurnedOn =
false;
124 TrackConstraintBRVisitor(DefinedSVal constraint,
bool assumption)
125 : Constraint(constraint), Assumption(assumption),
126 IsZeroCheck(!Assumption && Constraint.getAs<Loc>()) {}
128 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
132 static const char *getTag();
134 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
135 const ExplodedNode *PrevN,
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 const ExplodedNode *PrevN,
155 BugReporterContext &BRC,
156 BugReport &BR)
override;
160 static const Expr *getNilReceiver(
const Stmt *S,
const ExplodedNode *N);
166 static const char *
const GenericTrueMessage;
167 static const char *
const GenericFalseMessage;
170 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
177 static const char *getTag();
179 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
180 const ExplodedNode *Prev,
181 BugReporterContext &BRC,
182 BugReport &BR)
override;
184 std::shared_ptr<PathDiagnosticPiece> VisitNodeImpl(
const ExplodedNode *N,
185 const ExplodedNode *Prev,
186 BugReporterContext &BRC,
189 std::shared_ptr<PathDiagnosticPiece>
190 VisitTerminator(
const Stmt *Term,
const ExplodedNode *N,
191 const CFGBlock *srcBlk,
const CFGBlock *dstBlk, BugReport &R,
192 BugReporterContext &BRC);
194 std::shared_ptr<PathDiagnosticPiece>
195 VisitTrueTest(
const Expr *Cond,
bool tookTrue, BugReporterContext &BRC,
196 BugReport &R,
const ExplodedNode *N);
198 std::shared_ptr<PathDiagnosticPiece>
199 VisitTrueTest(
const Expr *Cond,
const DeclRefExpr *DR,
const bool tookTrue,
200 BugReporterContext &BRC, BugReport &R,
const ExplodedNode *N);
202 std::shared_ptr<PathDiagnosticPiece>
203 VisitTrueTest(
const Expr *Cond,
const BinaryOperator *BExpr,
204 const bool tookTrue, BugReporterContext &BRC, BugReport &R,
205 const ExplodedNode *N);
207 std::shared_ptr<PathDiagnosticPiece>
208 VisitConditionVariable(StringRef LhsString,
const Expr *CondVarExpr,
209 const bool tookTrue, BugReporterContext &BRC,
210 BugReport &R,
const ExplodedNode *N);
212 bool patternMatch(
const Expr *Ex,
213 const Expr *ParentEx,
215 BugReporterContext &BRC,
217 const ExplodedNode *N,
218 Optional<bool> &prunable);
220 static bool isPieceMessageGeneric(
const PathDiagnosticPiece *Piece);
226 class LikelyFalsePositiveSuppressionBRVisitor final
229 static void *getTag() {
231 return static_cast<void *
>(&Tag);
234 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
235 ID.AddPointer(getTag());
238 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
239 const ExplodedNode *Prev,
240 BugReporterContext &BRC,
241 BugReport &BR)
override {
245 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *N,
246 BugReport &BR)
override;
259 UndefOrNullArgVisitor(
const MemRegion *InR) : R(InR) {}
261 void Profile(llvm::FoldingSetNodeID &ID)
const override {
267 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
268 const ExplodedNode *PrevN,
269 BugReporterContext &BRC,
270 BugReport &BR)
override;
279 bool IsSatisfied =
false;
286 bool IsTrackingTurnedOn =
false;
289 SuppressInlineDefensiveChecksVisitor(DefinedSVal Val,
const ExplodedNode *N);
291 void Profile(llvm::FoldingSetNodeID &ID)
const override;
295 static const char *getTag();
297 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *Succ,
298 const ExplodedNode *Pred,
299 BugReporterContext &BRC,
300 BugReport &BR)
override;
304 bool Satisfied =
false;
307 CXXSelfAssignmentBRVisitor() =
default;
309 void Profile(llvm::FoldingSetNodeID &ID)
const override {}
311 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *Succ,
312 const ExplodedNode *Pred,
313 BugReporterContext &BRC,
314 BugReport &BR)
override;
324 TaintBugVisitor(
const SVal V) : V(V) {}
325 void Profile(llvm::FoldingSetNodeID &ID)
const override { ID.Add(V); }
327 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
328 const ExplodedNode *PrevN,
329 BugReporterContext &BRC,
330 BugReport &BR)
override;
342 FalsePositiveRefutationBRVisitor();
344 void Profile(llvm::FoldingSetNodeID &ID)
const override;
346 std::shared_ptr<PathDiagnosticPiece> VisitNode(
const ExplodedNode *N,
347 const ExplodedNode *PrevN,
348 BugReporterContext &BRC,
349 BugReport &BR)
override;
351 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *EndPathNode,
352 BugReport &BR)
override;
355 namespace bugreporter {
373 bool trackNullOrUndefValue(
const ExplodedNode *N,
const Stmt *S, BugReport &R,
375 bool EnableNullFPSuppression =
true);
377 const Expr *getDerefExpr(
const Stmt *S);
378 const Stmt *GetDenomExpr(
const ExplodedNode *N);
379 const Stmt *GetRetValExpr(
const ExplodedNode *N);
380 bool isDeclRefExprToReference(
const Expr *E);
388 #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.