150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks//===--- BugReporterVisitor.h - Generate PathDiagnostics -------*- C++ -*-===// 250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// 350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// The LLVM Compiler Infrastructure 450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// 550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// This file is distributed under the University of Illinois Open Source 650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// License. See LICENSE.TXT for details. 750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// 850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks//===----------------------------------------------------------------------===// 950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// 1050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// This file declares BugReporterVisitors, which are used to generate enhanced 1150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// diagnostic traces. 1250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks// 1350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks//===----------------------------------------------------------------------===// 1450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 1550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks#ifndef LLVM_CLANG_GR_BUGREPORTERVISITOR 1650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks#define LLVM_CLANG_GR_BUGREPORTERVISITOR 1750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 1850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 1950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks#include "llvm/ADT/FoldingSet.h" 2050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 2150bbc165b063155cc23c360deb7b865502e068e2Anna Zaksnamespace clang { 2250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 2350bbc165b063155cc23c360deb7b865502e068e2Anna Zaksnamespace ento { 2450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 2550bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass BugReport; 2650bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass BugReporterContext; 2750bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass ExplodedNode; 2850bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass MemRegion; 2950bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass PathDiagnosticPiece; 3050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 31011534973e83db51f49098871186238fc64d5f54Jordy Rose/// \brief BugReporterVisitors are used to add custom diagnostics along a path. 32011534973e83db51f49098871186238fc64d5f54Jordy Rose/// 33011534973e83db51f49098871186238fc64d5f54Jordy Rose/// Custom visitors should subclass the BugReporterVisitorImpl class for a 34011534973e83db51f49098871186238fc64d5f54Jordy Rose/// default implementation of the clone() method. 35011534973e83db51f49098871186238fc64d5f54Jordy Rose/// (Warning: if you have a deep subclass of BugReporterVisitorImpl, the 36011534973e83db51f49098871186238fc64d5f54Jordy Rose/// default implementation of clone() will NOT do the right thing, and you 37011534973e83db51f49098871186238fc64d5f54Jordy Rose/// will have to provide your own implementation.) 3850bbc165b063155cc23c360deb7b865502e068e2Anna Zaksclass BugReporterVisitor : public llvm::FoldingSetNode { 3950bbc165b063155cc23c360deb7b865502e068e2Anna Zakspublic: 4050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks virtual ~BugReporterVisitor(); 4150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 42011534973e83db51f49098871186238fc64d5f54Jordy Rose /// \brief Returns a copy of this BugReporter. 43011534973e83db51f49098871186238fc64d5f54Jordy Rose /// 44011534973e83db51f49098871186238fc64d5f54Jordy Rose /// Custom BugReporterVisitors should not override this method directly. 45011534973e83db51f49098871186238fc64d5f54Jordy Rose /// Instead, they should inherit from BugReporterVisitorImpl and provide 46011534973e83db51f49098871186238fc64d5f54Jordy Rose /// a protected or public copy constructor. 47011534973e83db51f49098871186238fc64d5f54Jordy Rose /// 48011534973e83db51f49098871186238fc64d5f54Jordy Rose /// (Warning: if you have a deep subclass of BugReporterVisitorImpl, the 49011534973e83db51f49098871186238fc64d5f54Jordy Rose /// default implementation of clone() will NOT do the right thing, and you 50011534973e83db51f49098871186238fc64d5f54Jordy Rose /// will have to provide your own implementation.) 51011534973e83db51f49098871186238fc64d5f54Jordy Rose virtual BugReporterVisitor *clone() const = 0; 52011534973e83db51f49098871186238fc64d5f54Jordy Rose 5350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// \brief Return a diagnostic piece which should be associated with the 5450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// given node. 5550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// 5650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// The last parameter can be used to register a new visitor with the given 5750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// BugReport while processing a node. 5850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks virtual PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 5950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const ExplodedNode *PrevN, 6050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC, 6150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReport &BR) = 0; 6250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 6323f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// \brief Provide custom definition for the final diagnostic piece on the 6423f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// path - the piece, which is displayed before the path is expanded. 6523f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// 6623f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// If returns NULL the default implementation will be used. 6723f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// Also note that at most one visitor of a BugReport should generate a 6823f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// non-NULL end of path diagnostic piece. 6923f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks virtual PathDiagnosticPiece *getEndPath(BugReporterContext &BRC, 7023f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks const ExplodedNode *N, 7123f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks BugReport &BR); 7223f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks 7350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0; 7423f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks 7523f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks /// \brief Generates the default final diagnostic piece. 7623f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks static PathDiagnosticPiece *getDefaultEndPath(BugReporterContext &BRC, 7723f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks const ExplodedNode *N, 7823f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks BugReport &BR); 7923f395ee1bf4e4aa76b310d896a951799eaca94aAnna Zaks 8050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks}; 8150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 82011534973e83db51f49098871186238fc64d5f54Jordy Rose/// This class provides a convenience implementation for clone() using the 83011534973e83db51f49098871186238fc64d5f54Jordy Rose/// Curiously-Recurring Template Pattern. If you are implementing a custom 84011534973e83db51f49098871186238fc64d5f54Jordy Rose/// BugReporterVisitor, subclass BugReporterVisitorImpl and provide a public 85011534973e83db51f49098871186238fc64d5f54Jordy Rose/// or protected copy constructor. 86011534973e83db51f49098871186238fc64d5f54Jordy Rose/// 87011534973e83db51f49098871186238fc64d5f54Jordy Rose/// (Warning: if you have a deep subclass of BugReporterVisitorImpl, the 88011534973e83db51f49098871186238fc64d5f54Jordy Rose/// default implementation of clone() will NOT do the right thing, and you 89011534973e83db51f49098871186238fc64d5f54Jordy Rose/// will have to provide your own implementation.) 90011534973e83db51f49098871186238fc64d5f54Jordy Rosetemplate <class DERIVED> 91011534973e83db51f49098871186238fc64d5f54Jordy Roseclass BugReporterVisitorImpl : public BugReporterVisitor { 92011534973e83db51f49098871186238fc64d5f54Jordy Rose virtual BugReporterVisitor *clone() const { 93d961ea91e14fdf4047db3e891def9951ee7afde1Benjamin Kramer return new DERIVED(*static_cast<const DERIVED *>(this)); 94011534973e83db51f49098871186238fc64d5f54Jordy Rose } 95011534973e83db51f49098871186238fc64d5f54Jordy Rose}; 96011534973e83db51f49098871186238fc64d5f54Jordy Rose 97011534973e83db51f49098871186238fc64d5f54Jordy Roseclass FindLastStoreBRVisitor 98011534973e83db51f49098871186238fc64d5f54Jordy Rose : public BugReporterVisitorImpl<FindLastStoreBRVisitor> 99011534973e83db51f49098871186238fc64d5f54Jordy Rose{ 10050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const MemRegion *R; 10150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks SVal V; 10250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks bool satisfied; 10350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 10450bbc165b063155cc23c360deb7b865502e068e2Anna Zakspublic: 10550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// \brief Convenience method to create a visitor given only the MemRegion. 10650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// Returns NULL if the visitor cannot be created. For example, when the 10750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// corresponding value is unknown. 10850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks static BugReporterVisitor *createVisitorObject(const ExplodedNode *N, 10950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const MemRegion *R); 11050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 11150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// Creates a visitor for every VarDecl inside a Stmt and registers it with 11250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks /// the BugReport. 11350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks static void registerStatementVarDecls(BugReport &BR, const Stmt *S); 11450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 11550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks FindLastStoreBRVisitor(SVal v, const MemRegion *r) 116166b7bd43551964d65bcf4918f51a167b8374e2aJordan Rose : R(r), V(v), satisfied(false) { 11750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks assert (!V.isUnknown() && "Cannot track unknown value."); 11850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 11950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks // TODO: Does it make sense to allow undef values here? 12050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks // (If not, also see UndefCapturedBlockVarChecker)? 12150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks } 12250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 12350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks void Profile(llvm::FoldingSetNodeID &ID) const; 12450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 12550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 12650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const ExplodedNode *PrevN, 12750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC, 12850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReport &BR); 12950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks}; 13050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 131011534973e83db51f49098871186238fc64d5f54Jordy Roseclass TrackConstraintBRVisitor 132011534973e83db51f49098871186238fc64d5f54Jordy Rose : public BugReporterVisitorImpl<TrackConstraintBRVisitor> 133011534973e83db51f49098871186238fc64d5f54Jordy Rose{ 13450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks DefinedSVal Constraint; 13550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const bool Assumption; 13650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks bool isSatisfied; 13750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 13850bbc165b063155cc23c360deb7b865502e068e2Anna Zakspublic: 13950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks TrackConstraintBRVisitor(DefinedSVal constraint, bool assumption) 14050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks : Constraint(constraint), Assumption(assumption), isSatisfied(false) {} 14150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 14250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks void Profile(llvm::FoldingSetNodeID &ID) const; 14350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 14450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 14550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const ExplodedNode *PrevN, 14650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC, 14750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReport &BR); 14850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks}; 14950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 150011534973e83db51f49098871186238fc64d5f54Jordy Roseclass NilReceiverBRVisitor 151011534973e83db51f49098871186238fc64d5f54Jordy Rose : public BugReporterVisitorImpl<NilReceiverBRVisitor> 152011534973e83db51f49098871186238fc64d5f54Jordy Rose{ 15350bbc165b063155cc23c360deb7b865502e068e2Anna Zakspublic: 15450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks void Profile(llvm::FoldingSetNodeID &ID) const { 15550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks static int x = 0; 15650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks ID.AddPointer(&x); 15750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks } 15850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 15950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 16050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const ExplodedNode *PrevN, 16150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC, 16250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReport &BR); 16350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks}; 16450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 16550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks/// Visitor that tries to report interesting diagnostics from conditions. 166011534973e83db51f49098871186238fc64d5f54Jordy Roseclass ConditionBRVisitor : public BugReporterVisitorImpl<ConditionBRVisitor> { 16750bbc165b063155cc23c360deb7b865502e068e2Anna Zakspublic: 16850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks void Profile(llvm::FoldingSetNodeID &ID) const { 16950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks static int x = 0; 17050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks ID.AddPointer(&x); 17150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks } 17250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 173c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek 17450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks virtual PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 17550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const ExplodedNode *Prev, 17650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC, 17750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReport &BR); 17850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 179c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek PathDiagnosticPiece *VisitNodeImpl(const ExplodedNode *N, 180c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek const ExplodedNode *Prev, 181c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek BugReporterContext &BRC, 182c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek BugReport &BR); 183c89f4b05721f53cfbaf32fc0c4919a4616e68440Ted Kremenek 18450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitTerminator(const Stmt *Term, 185220ac8c175cb1bf9b18d82eefe036995d7a2164dAnna Zaks const ExplodedNode *N, 18650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const CFGBlock *srcBlk, 18750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const CFGBlock *dstBlk, 18876aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 18950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks BugReporterContext &BRC); 19050bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 19150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitTrueTest(const Expr *Cond, 19250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks bool tookTrue, 193220ac8c175cb1bf9b18d82eefe036995d7a2164dAnna Zaks BugReporterContext &BRC, 19476aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 19576aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek const ExplodedNode *N); 19650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 19750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitTrueTest(const Expr *Cond, 19850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const DeclRefExpr *DR, 19950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const bool tookTrue, 200220ac8c175cb1bf9b18d82eefe036995d7a2164dAnna Zaks BugReporterContext &BRC, 20176aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 20276aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek const ExplodedNode *N); 20350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 20450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks PathDiagnosticPiece *VisitTrueTest(const Expr *Cond, 20550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const BinaryOperator *BExpr, 20650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks const bool tookTrue, 207220ac8c175cb1bf9b18d82eefe036995d7a2164dAnna Zaks BugReporterContext &BRC, 20876aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 20976aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek const ExplodedNode *N); 210d1247c5002ee511e6f6c3c26214221c391d437cdTed Kremenek 211d1247c5002ee511e6f6c3c26214221c391d437cdTed Kremenek PathDiagnosticPiece *VisitConditionVariable(StringRef LhsString, 212d1247c5002ee511e6f6c3c26214221c391d437cdTed Kremenek const Expr *CondVarExpr, 213d1247c5002ee511e6f6c3c26214221c391d437cdTed Kremenek const bool tookTrue, 214d1247c5002ee511e6f6c3c26214221c391d437cdTed Kremenek BugReporterContext &BRC, 21576aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 21676aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek const ExplodedNode *N); 21750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 21850bbc165b063155cc23c360deb7b865502e068e2Anna Zaks bool patternMatch(const Expr *Ex, 21950bbc165b063155cc23c360deb7b865502e068e2Anna Zaks llvm::raw_ostream &Out, 22076aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReporterContext &BRC, 22176aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek BugReport &R, 22276aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek const ExplodedNode *N, 22376aadc346c3a4c363238a1e1232f324c3355d9e0Ted Kremenek llvm::Optional<bool> &prunable); 22450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks}; 22580de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 22680de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks/// \brief When a region containing undefined value or '0' value is passed 22780de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks/// as an argument in a call, marks the call as interesting. 22880de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks/// 22980de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks/// As a result, BugReporter will not prune the path through the function even 23080de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks/// if the region's contents are not modified/accessed by the call. 23180de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaksclass UndefOrNullArgVisitor 23280de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks : public BugReporterVisitorImpl<UndefOrNullArgVisitor> { 23380de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 23480de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks /// The interesting memory region this visitor is tracking. 23580de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks const MemRegion *R; 23680de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 23780de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zakspublic: 23880de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks UndefOrNullArgVisitor(const MemRegion *InR) : R(InR) {} 23980de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 24080de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks virtual void Profile(llvm::FoldingSetNodeID &ID) const { 24180de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks static int Tag = 0; 24280de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks ID.AddPointer(&Tag); 24380de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks ID.AddPointer(R); 24480de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks } 24580de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 24680de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 24780de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks const ExplodedNode *PrevN, 24880de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks BugReporterContext &BRC, 24980de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks BugReport &BR); 25080de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks}; 25180de487e03dd0f44e4572e2122ebc1aa6a3961f5Anna Zaks 25250bbc165b063155cc23c360deb7b865502e068e2Anna Zaksnamespace bugreporter { 25350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 254a1f81bb0e55749a1414b1b5124bb83b9052ff2acJordan Rosevoid trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S, BugReport &R); 25550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 25650bbc165b063155cc23c360deb7b865502e068e2Anna Zaksconst Stmt *GetDerefExpr(const ExplodedNode *N); 25750bbc165b063155cc23c360deb7b865502e068e2Anna Zaksconst Stmt *GetDenomExpr(const ExplodedNode *N); 25850bbc165b063155cc23c360deb7b865502e068e2Anna Zaksconst Stmt *GetRetValExpr(const ExplodedNode *N); 2599b925ac059089dfe74e3b8fa5effe519fb9ee885Anna Zaksbool isDeclRefExprToReference(const Expr *E); 2609b925ac059089dfe74e3b8fa5effe519fb9ee885Anna Zaks 26150bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 26250bbc165b063155cc23c360deb7b865502e068e2Anna Zaks} // end namespace clang 26350bbc165b063155cc23c360deb7b865502e068e2Anna Zaks} // end namespace ento 26450bbc165b063155cc23c360deb7b865502e068e2Anna Zaks} // end namespace bugreporter 26550bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 26650bbc165b063155cc23c360deb7b865502e068e2Anna Zaks 26750bbc165b063155cc23c360deb7b865502e068e2Anna Zaks#endif //LLVM_CLANG_GR__BUGREPORTERVISITOR 268