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" 36 class PathSensitiveBugReport;
37 class BugReporterContext;
40 class PathDiagnosticPiece;
62 BugReporterContext &BRC,
63 PathSensitiveBugReport &BR) = 0;
67 virtual void finalizeVisitor(BugReporterContext &BRC,
68 const ExplodedNode *EndPathNode,
69 PathSensitiveBugReport &BR);
77 const ExplodedNode *N,
78 PathSensitiveBugReport &BR);
80 virtual void Profile(llvm::FoldingSetNodeID &
ID)
const = 0;
84 getDefaultEndPath(
const BugReporterContext &BRC,
const ExplodedNode *N,
85 const PathSensitiveBugReport &BR);
88 namespace bugreporter {
91 enum class TrackingKind {
114 bool trackExpressionValue(
const ExplodedNode *N,
const Expr *E,
115 PathSensitiveBugReport &R,
116 TrackingKind TKind = TrackingKind::Thorough,
117 bool EnableNullFPSuppression =
true);
119 const Expr *getDerefExpr(
const Stmt *S);
128 bool Satisfied =
false;
132 bool EnableNullFPSuppression;
134 using TrackingKind = bugreporter::TrackingKind;
136 const StackFrameContext *OriginSFC;
149 FindLastStoreBRVisitor(KnownSVal V,
const MemRegion *R,
150 bool InEnableNullFPSuppression, TrackingKind TKind,
151 const StackFrameContext *OriginSFC =
nullptr)
152 : R(R), V(V), EnableNullFPSuppression(InEnableNullFPSuppression),
153 TKind(TKind), OriginSFC(OriginSFC) {
157 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
160 BugReporterContext &BRC,
161 PathSensitiveBugReport &BR)
override;
165 DefinedSVal Constraint;
167 bool IsSatisfied =
false;
172 bool IsTrackingTurnedOn =
false;
175 TrackConstraintBRVisitor(DefinedSVal constraint,
bool assumption)
176 : Constraint(constraint), Assumption(assumption),
177 IsZeroCheck(!Assumption && Constraint.getAs<Loc>()) {}
179 void Profile(llvm::FoldingSetNodeID &
ID)
const override;
183 static const char *getTag();
186 BugReporterContext &BRC,
187 PathSensitiveBugReport &BR)
override;
191 bool isUnderconstrained(
const ExplodedNode *N)
const;
198 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
204 BugReporterContext &BRC,
205 PathSensitiveBugReport &BR)
override;
209 static const Expr *getNilReceiver(
const Stmt *S,
const ExplodedNode *N);
215 constexpr
static llvm::StringLiteral GenericTrueMessage =
216 "Assuming the condition is true";
217 constexpr
static llvm::StringLiteral GenericFalseMessage =
218 "Assuming the condition is false";
221 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
228 static const char *getTag();
231 BugReporterContext &BRC,
232 PathSensitiveBugReport &BR)
override;
235 BugReporterContext &BRC,
236 PathSensitiveBugReport &BR);
239 VisitTerminator(
const Stmt *Term,
const ExplodedNode *N,
240 const CFGBlock *SrcBlk,
const CFGBlock *DstBlk,
241 PathSensitiveBugReport &R, BugReporterContext &BRC);
244 BugReporterContext &BRC,
245 PathSensitiveBugReport &R,
246 const ExplodedNode *N,
bool TookTrue);
249 BugReporterContext &BRC,
250 PathSensitiveBugReport &R,
251 const ExplodedNode *N,
bool TookTrue,
255 VisitTrueTest(
const Expr *Cond,
const BinaryOperator *BExpr,
256 BugReporterContext &BRC, PathSensitiveBugReport &R,
257 const ExplodedNode *N,
bool TookTrue,
bool IsAssuming);
260 BugReporterContext &BRC,
261 PathSensitiveBugReport &R,
262 const ExplodedNode *N,
bool TookTrue,
266 VisitConditionVariable(StringRef LhsString,
const Expr *CondVarExpr,
267 BugReporterContext &BRC, PathSensitiveBugReport &R,
268 const ExplodedNode *N,
bool TookTrue);
279 bool printValue(
const Expr *CondVarExpr, raw_ostream &Out,
280 const ExplodedNode *N,
bool TookTrue,
bool IsAssuming);
282 bool patternMatch(
const Expr *Ex,
283 const Expr *ParentEx,
285 BugReporterContext &BRC,
286 PathSensitiveBugReport &R,
287 const ExplodedNode *N,
289 bool IsSameFieldName);
291 static bool isPieceMessageGeneric(
const PathDiagnosticPiece *Piece);
297 class LikelyFalsePositiveSuppressionBRVisitor final
300 static void *getTag() {
302 return static_cast<void *
>(&Tag);
305 void Profile(llvm::FoldingSetNodeID &
ID)
const override {
306 ID.AddPointer(getTag());
310 PathSensitiveBugReport &)
override {
314 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *N,
315 PathSensitiveBugReport &BR)
override;
328 UndefOrNullArgVisitor(
const MemRegion *InR) : R(InR) {}
330 void Profile(llvm::FoldingSetNodeID &ID)
const override {
337 BugReporterContext &BRC,
338 PathSensitiveBugReport &BR)
override;
347 bool IsSatisfied =
false;
354 bool IsTrackingTurnedOn =
false;
357 SuppressInlineDefensiveChecksVisitor(DefinedSVal Val,
const ExplodedNode *N);
359 void Profile(llvm::FoldingSetNodeID &ID)
const override;
363 static const char *getTag();
366 BugReporterContext &BRC,
367 PathSensitiveBugReport &BR)
override;
379 FalsePositiveRefutationBRVisitor();
381 void Profile(llvm::FoldingSetNodeID &ID)
const override;
384 BugReporterContext &BRC,
385 PathSensitiveBugReport &BR)
override;
387 void finalizeVisitor(BugReporterContext &BRC,
const ExplodedNode *EndPathNode,
388 PathSensitiveBugReport &BR)
override;
395 void Profile(llvm::FoldingSetNodeID &ID)
const override;
398 BugReporterContext &BRC,
399 PathSensitiveBugReport &R)
override;
406 #endif // LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGREPORTERVISITORS_H
llvm::ImmutableMap< SymbolRef, RangeSet > ConstraintRangeTy
std::shared_ptr< PathDiagnosticPiece > PathDiagnosticPieceRef
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
Dataflow Directional Tag Classes.