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