CheckerContext.h revision 3d7c44e01d568e5d5c0fac9c6ccb3f080157ba19
16bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//== CheckerContext.h - Context info for path-sensitive checkers--*- C++ -*--=//
26bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//
36bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
46bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//
56bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
66bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
76bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//
86bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
96bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//
106bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//  This file defines CheckerContext that provides contextual info for
116bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// path-sensitive checkers.
126bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//
136bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
146bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
156bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#ifndef LLVM_CLANG_SA_CORE_PATHSENSITIVE_CHECKERCONTEXT
166bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#define LLVM_CLANG_SA_CORE_PATHSENSITIVE_CHECKERCONTEXT
176bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
186bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
196bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
206bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisnamespace clang {
216bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisnamespace ento {
226bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
236bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisclass CheckerContext {
246bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  ExprEngine &Eng;
2557300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// The current exploded(symbolic execution) graph node.
266bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  ExplodedNode *Pred;
2757300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// The flag is true if the (state of the execution) has been modified
2857300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// by the checker using this context. For example, a new transition has been
2957300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// added or a bug report issued.
3057300760964904cc022a175643342f29f46b7e6bAnna Zaks  bool Changed;
3157300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// The tagged location, which is used to generate all new nodes.
323f5e8d87dbf449d8b39fe96068415428594d370eAnna Zaks  const ProgramPoint Location;
333152b3cb5b6a2f797d0972c81a5eb3fd69c0d620Anna Zaks  NodeBuilder &NB;
34063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks
356bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidispublic:
368ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks  CheckerContext(NodeBuilder &builder,
3718c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                 ExprEngine &eng,
3818c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                 ExplodedNode *pred,
39063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks                 const ProgramPoint &loc)
408ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks    : Eng(eng),
4118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek      Pred(pred),
4257300760964904cc022a175643342f29f46b7e6bAnna Zaks      Changed(false),
433f5e8d87dbf449d8b39fe96068415428594d370eAnna Zaks      Location(loc),
44777d706547ebc751d998134774d9d5388fff8e02Anna Zaks      NB(builder) {
45777d706547ebc751d998134774d9d5388fff8e02Anna Zaks    assert(Pred->getState() &&
46777d706547ebc751d998134774d9d5388fff8e02Anna Zaks           "We should not call the checkers on an empty state.");
47777d706547ebc751d998134774d9d5388fff8e02Anna Zaks  }
486bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
496bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  AnalysisManager &getAnalysisManager() {
506bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getAnalysisManager();
516bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
526bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
536bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  ConstraintManager &getConstraintManager() {
546bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getConstraintManager();
556bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
566bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
576bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  StoreManager &getStoreManager() {
586bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getStoreManager();
596bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
606bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
61a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks  /// \brief Returns the previous node in the exploded graph, which includes
62a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks  /// the state of the program before the checker ran. Note, checkers should
63a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks  /// not retain the node in their state since the nodes might get invalidated.
6439ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks  ExplodedNode *getPredecessor() { return Pred; }
658bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  ProgramStateRef getState() const { return Pred->getState(); }
666bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
6757300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// \brief Check if the checker changed the state of the execution; ex: added
6857300760964904cc022a175643342f29f46b7e6bAnna Zaks  /// a new transition or a bug report.
6957300760964904cc022a175643342f29f46b7e6bAnna Zaks  bool isDifferent() { return Changed; }
7057300760964904cc022a175643342f29f46b7e6bAnna Zaks
715d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks  /// \brief Returns the number of times the current block has been visited
725d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks  /// along the analyzed path.
73eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks  unsigned getCurrentBlockCount() const {
74ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks    return NB.getContext().getCurrentBlockCount();
75ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks  }
765d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks
776bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  ASTContext &getASTContext() {
786bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getContext();
796bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
80461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks
814e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const {
824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    return Eng.getContext().getLangOpts();
83461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  }
84461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks
85eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks  const LocationContext *getLocationContext() const {
8639ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks    return Pred->getLocationContext();
8739ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks  }
8839ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks
896bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  BugReporter &getBugReporter() {
906bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getBugReporter();
916bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
926bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
936bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  SourceManager &getSourceManager() {
946bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return getBugReporter().getSourceManager();
956bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
966bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
976bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  SValBuilder &getSValBuilder() {
986bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return Eng.getSValBuilder();
996bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
1006bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
1013f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks  SymbolManager &getSymbolManager() {
1023f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks    return getSValBuilder().getSymbolManager();
1033f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks  }
1043f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks
105eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks  bool isObjCGCEnabled() const {
10617a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose    return Eng.isObjCGCEnabled();
10717a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose  }
10817a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose
1096a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks  ProgramStateManager &getStateManager() {
1106a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks    return Eng.getStateManager();
1116a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks  }
1126a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks
113063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks  AnalysisDeclContext *getCurrentAnalysisDeclContext() const {
114063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks    return Pred->getLocationContext()->getAnalysisDeclContext();
115063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks  }
116063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks
1173d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief If the given node corresponds to a PostStore program point, retrieve
1183d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// the location region as it was uttered in the code.
1193d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  ///
1203d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// This utility can be useful for generating extensive diagnostics, for
1213d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// example, for finding variables that the given symbol was assigned to.
1223d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  static const MemRegion *getLocationRegionIfPostStore(const ExplodedNode *N) {
1233d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks    ProgramPoint L = N->getLocation();
1243d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks    if (const PostStore *PSL = dyn_cast<PostStore>(&L))
1253d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks      return reinterpret_cast<const MemRegion*>(PSL->getLocationValue());
1263d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks    return 0;
1273d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  }
1283d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1290bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// \brief Generates a new transition in the program state graph
1300bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// (ExplodedGraph). Uses the default CheckerContext predecessor node.
1310bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///
1320bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param State The state of the generated node.
1330bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param Tag The tag is used to uniquely identify the creation site. If no
1340bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///        tag is specified, a default tag, unique to the given checker,
1350bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///        will be used. Tags are used to prevent states generated at
1360bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///        different sites from caching out.
1378bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  ExplodedNode *addTransition(ProgramStateRef State,
1380bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks                              const ProgramPointTag *Tag = 0) {
1390bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks    return addTransitionImpl(State, false, 0, Tag);
1406bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
1410bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks
1420bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// \brief Generates a default transition (containing checker tag but no
1430bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// checker state changes).
1440bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ExplodedNode *addTransition() {
1450bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks    return addTransition(getState());
146063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks  }
147063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks
1480bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// \brief Generates a new transition with the given predecessor.
1498ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks  /// Allows checkers to generate a chain of nodes.
1500bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///
1510bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param State The state of the generated node.
1520bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param Pred The transition will be generated from the specified Pred node
1530bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///             to the newly generated node.
1540bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param Tag The tag to uniquely identify the creation site.
1550bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  /// @param IsSink Mark the new node as sink, which will stop exploration of
1560bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks  ///               the given path.
1578bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  ExplodedNode *addTransition(ProgramStateRef State,
1580bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks                             ExplodedNode *Pred,
1590bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks                             const ProgramPointTag *Tag = 0,
1600bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks                             bool IsSink = false) {
1610bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks    return addTransitionImpl(State, IsSink, Pred, Tag);
1626bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
1636bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
1648ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks  /// \brief Generate a sink node. Generating sink stops exploration of the
1658ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks  /// given path.
1668bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  ExplodedNode *generateSink(ProgramStateRef state = 0) {
1670bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks    return addTransitionImpl(state ? state : getState(), true);
1686bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
1696bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
170063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks  /// \brief Emit the diagnostics report.
1716bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  void EmitReport(BugReport *R) {
17257300760964904cc022a175643342f29f46b7e6bAnna Zaks    Changed = true;
1736bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    Eng.getBugReporter().EmitReport(R);
1746bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
1756bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
176b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks  /// \brief Get the declaration of the called function (path-sensitive).
177b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks  const FunctionDecl *getCalleeDecl(const CallExpr *CE) const;
178b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks
1790e12ebfd3ef9ad5d894466c6e4910ac5e6041034Anna Zaks  /// \brief Get the name of the called function (path-sensitive).
1809b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  StringRef getCalleeName(const FunctionDecl *FunDecl) const;
1819b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks
1829b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  /// \brief Get the name of the called function (path-sensitive).
1839b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  StringRef getCalleeName(const CallExpr *CE) const {
1849b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks    const FunctionDecl *FunDecl = getCalleeDecl(CE);
1859b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks    return getCalleeName(FunDecl);
1869b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  }
1879b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks
1889b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  /// Given a function declaration and a name checks if this is a C lib
1899b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  /// function with the given name.
1909b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks  bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name);
191e00575f12cf280621ef0ed4d69e909bdfc9fef62Anna Zaks  static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name,
192e00575f12cf280621ef0ed4d69e909bdfc9fef62Anna Zaks                                 ASTContext &Context);
1930e12ebfd3ef9ad5d894466c6e4910ac5e6041034Anna Zaks
194461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// \brief Depending on wither the location corresponds to a macro, return
195461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// either the macro name or the token spelling.
196461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  ///
197461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// This could be useful when checkers' logic depends on whether a function
198461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// is called with a given macro argument. For example:
199461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  ///   s = socket(AF_INET,..)
200461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// If AF_INET is a macro, the result should be treated as a source of taint.
201461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  ///
202461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  /// \sa clang::Lexer::getSpelling(), clang::Lexer::getImmediateMacroName().
203461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks  StringRef getMacroNameOrSpelling(SourceLocation &Loc);
204461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks
2056bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisprivate:
2068bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  ExplodedNode *addTransitionImpl(ProgramStateRef State,
20739ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks                                 bool MarkAsSink,
20839ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks                                 ExplodedNode *P = 0,
20939ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks                                 const ProgramPointTag *Tag = 0) {
210c8bb3befcad8cd8fc9556bc265289b07dc3c94c8Anna Zaks    if (!State || (State == Pred->getState() && !Tag && !MarkAsSink))
211df95d146c13cf02e106b32b01d147577d6d6b5a1Anna Zaks      return Pred;
212df95d146c13cf02e106b32b01d147577d6d6b5a1Anna Zaks
21357300760964904cc022a175643342f29f46b7e6bAnna Zaks    Changed = true;
21439ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks    ExplodedNode *node = NB.generateNode(Tag ? Location.withTag(Tag) : Location,
21539ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks                                        State,
21639ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks                                        P ? P : Pred, MarkAsSink);
2176bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis    return node;
2186bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis  }
2196bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis};
2206bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
22157300760964904cc022a175643342f29f46b7e6bAnna Zaks/// \brief A helper class which wraps a boolean value set to false by default.
22257300760964904cc022a175643342f29f46b7e6bAnna Zaksstruct DefaultBool {
22357300760964904cc022a175643342f29f46b7e6bAnna Zaks  bool Val;
22457300760964904cc022a175643342f29f46b7e6bAnna Zaks  DefaultBool() : Val(false) {}
22557300760964904cc022a175643342f29f46b7e6bAnna Zaks  operator bool() const { return Val; }
22657300760964904cc022a175643342f29f46b7e6bAnna Zaks  DefaultBool &operator=(bool b) { Val = b; return *this; }
22757300760964904cc022a175643342f29f46b7e6bAnna Zaks};
22857300760964904cc022a175643342f29f46b7e6bAnna Zaks
2296bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // end GR namespace
2306bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
2316bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // end clang namespace
2326bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis
2336bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#endif
234