CheckerContext.h revision 514f2c9dcb9e04b52929c5b141a6fe88bd68b33f
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: 36514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek /// If we are post visiting a call, this flag will be set if the 37514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek /// call was inlined. In all other cases it will be false. 38514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek const bool wasInlined; 39514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek 408ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks CheckerContext(NodeBuilder &builder, 4118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ExprEngine &eng, 4218c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ExplodedNode *pred, 43514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek const ProgramPoint &loc, 44514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek bool wasInlined = false) 458ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks : Eng(eng), 4618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek Pred(pred), 4757300760964904cc022a175643342f29f46b7e6bAnna Zaks Changed(false), 483f5e8d87dbf449d8b39fe96068415428594d370eAnna Zaks Location(loc), 49514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek NB(builder), 50514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek wasInlined(wasInlined) { 51777d706547ebc751d998134774d9d5388fff8e02Anna Zaks assert(Pred->getState() && 52777d706547ebc751d998134774d9d5388fff8e02Anna Zaks "We should not call the checkers on an empty state."); 53777d706547ebc751d998134774d9d5388fff8e02Anna Zaks } 546bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 556bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis AnalysisManager &getAnalysisManager() { 566bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getAnalysisManager(); 576bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 586bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 596bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis ConstraintManager &getConstraintManager() { 606bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getConstraintManager(); 616bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 626bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 636bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis StoreManager &getStoreManager() { 646bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getStoreManager(); 656bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 666bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 67a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks /// \brief Returns the previous node in the exploded graph, which includes 68a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks /// the state of the program before the checker ran. Note, checkers should 69a2a860306e3697fcf7a12c5ba59551ca60578968Anna Zaks /// not retain the node in their state since the nodes might get invalidated. 7039ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks ExplodedNode *getPredecessor() { return Pred; } 718bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef getState() const { return Pred->getState(); } 726bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 7357300760964904cc022a175643342f29f46b7e6bAnna Zaks /// \brief Check if the checker changed the state of the execution; ex: added 7457300760964904cc022a175643342f29f46b7e6bAnna Zaks /// a new transition or a bug report. 7557300760964904cc022a175643342f29f46b7e6bAnna Zaks bool isDifferent() { return Changed; } 7657300760964904cc022a175643342f29f46b7e6bAnna Zaks 775d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks /// \brief Returns the number of times the current block has been visited 785d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks /// along the analyzed path. 79eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks unsigned getCurrentBlockCount() const { 80ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks return NB.getContext().getCurrentBlockCount(); 81ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks } 825d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks 836bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis ASTContext &getASTContext() { 846bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getContext(); 856bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 86461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks 874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &getLangOpts() const { 884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie return Eng.getContext().getLangOpts(); 89461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks } 90461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks 91eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks const LocationContext *getLocationContext() const { 9239ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks return Pred->getLocationContext(); 9339ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks } 9439ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks 956bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis BugReporter &getBugReporter() { 966bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getBugReporter(); 976bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 986bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 996bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis SourceManager &getSourceManager() { 1006bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return getBugReporter().getSourceManager(); 1016bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1026bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1036bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis SValBuilder &getSValBuilder() { 1046bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return Eng.getSValBuilder(); 1056bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1066bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1073f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks SymbolManager &getSymbolManager() { 1083f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks return getSValBuilder().getSymbolManager(); 1093f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks } 1103f10e32b15e54f507aed90cb72d73c7acaa500bbAnna Zaks 111eeea7c44a6986752fedee1ef1bcef855db373872Anna Zaks bool isObjCGCEnabled() const { 11217a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose return Eng.isObjCGCEnabled(); 11317a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose } 11417a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose 1156a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks ProgramStateManager &getStateManager() { 1166a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks return Eng.getStateManager(); 1176a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks } 1186a93bd526c5136ee5a26871e829cf5a8548a1c6aAnna Zaks 119063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks AnalysisDeclContext *getCurrentAnalysisDeclContext() const { 120063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks return Pred->getLocationContext()->getAnalysisDeclContext(); 121063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks } 122063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks 1233d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// \brief If the given node corresponds to a PostStore program point, retrieve 1243d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// the location region as it was uttered in the code. 1253d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// 1263d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// This utility can be useful for generating extensive diagnostics, for 1273d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks /// example, for finding variables that the given symbol was assigned to. 1283d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks static const MemRegion *getLocationRegionIfPostStore(const ExplodedNode *N) { 1293d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks ProgramPoint L = N->getLocation(); 1303d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks if (const PostStore *PSL = dyn_cast<PostStore>(&L)) 1313d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks return reinterpret_cast<const MemRegion*>(PSL->getLocationValue()); 1323d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks return 0; 1333d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks } 1343d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 1350bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// \brief Generates a new transition in the program state graph 1360bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// (ExplodedGraph). Uses the default CheckerContext predecessor node. 1370bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// 1380bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param State The state of the generated node. 1390bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param Tag The tag is used to uniquely identify the creation site. If no 1400bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// tag is specified, a default tag, unique to the given checker, 1410bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// will be used. Tags are used to prevent states generated at 1420bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// different sites from caching out. 1438bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ExplodedNode *addTransition(ProgramStateRef State, 1440bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks const ProgramPointTag *Tag = 0) { 1450bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks return addTransitionImpl(State, false, 0, Tag); 1466bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1470bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks 1480bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// \brief Generates a default transition (containing checker tag but no 1490bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// checker state changes). 1500bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks ExplodedNode *addTransition() { 1510bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks return addTransition(getState()); 152063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks } 153063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks 1540bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// \brief Generates a new transition with the given predecessor. 1558ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks /// Allows checkers to generate a chain of nodes. 1560bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// 1570bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param State The state of the generated node. 1580bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param Pred The transition will be generated from the specified Pred node 1590bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// to the newly generated node. 1600bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param Tag The tag to uniquely identify the creation site. 1610bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// @param IsSink Mark the new node as sink, which will stop exploration of 1620bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks /// the given path. 1638bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ExplodedNode *addTransition(ProgramStateRef State, 1640bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks ExplodedNode *Pred, 1650bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks const ProgramPointTag *Tag = 0, 1660bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks bool IsSink = false) { 1670bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks return addTransitionImpl(State, IsSink, Pred, Tag); 1686bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1696bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1708ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks /// \brief Generate a sink node. Generating sink stops exploration of the 1718ba721428af297e540fb40b176eeeea0ee010c1fAnna Zaks /// given path. 1728bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ExplodedNode *generateSink(ProgramStateRef state = 0) { 1730bd6b110e908892d4b5c8671a9f435a1d72ad16aAnna Zaks return addTransitionImpl(state ? state : getState(), true); 1746bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1756bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 176063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks /// \brief Emit the diagnostics report. 1776bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis void EmitReport(BugReport *R) { 17857300760964904cc022a175643342f29f46b7e6bAnna Zaks Changed = true; 1796bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis Eng.getBugReporter().EmitReport(R); 1806bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 1816bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 182b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks /// \brief Get the declaration of the called function (path-sensitive). 183b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks const FunctionDecl *getCalleeDecl(const CallExpr *CE) const; 184b805c8ff133ef0c62df032fa711d6b13c5afd7f4Anna Zaks 1850e12ebfd3ef9ad5d894466c6e4910ac5e6041034Anna Zaks /// \brief Get the name of the called function (path-sensitive). 1869b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks StringRef getCalleeName(const FunctionDecl *FunDecl) const; 1879b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks 1889b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks /// \brief Get the name of the called function (path-sensitive). 1899b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks StringRef getCalleeName(const CallExpr *CE) const { 1909b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks const FunctionDecl *FunDecl = getCalleeDecl(CE); 1919b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks return getCalleeName(FunDecl); 1929b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks } 1939b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks 1949b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks /// Given a function declaration and a name checks if this is a C lib 1959b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks /// function with the given name. 1969b0c749a20d0f7d0e63441d76baa15def3f37fdbAnna Zaks bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name); 197e00575f12cf280621ef0ed4d69e909bdfc9fef62Anna Zaks static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name, 198e00575f12cf280621ef0ed4d69e909bdfc9fef62Anna Zaks ASTContext &Context); 1990e12ebfd3ef9ad5d894466c6e4910ac5e6041034Anna Zaks 200461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// \brief Depending on wither the location corresponds to a macro, return 201461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// either the macro name or the token spelling. 202461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// 203461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// This could be useful when checkers' logic depends on whether a function 204461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// is called with a given macro argument. For example: 205461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// s = socket(AF_INET,..) 206461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// If AF_INET is a macro, the result should be treated as a source of taint. 207461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// 208461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks /// \sa clang::Lexer::getSpelling(), clang::Lexer::getImmediateMacroName(). 209461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks StringRef getMacroNameOrSpelling(SourceLocation &Loc); 210461af1e502c9bd88330bbf17d449a7593fc0d624Anna Zaks 2116bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisprivate: 2128bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ExplodedNode *addTransitionImpl(ProgramStateRef State, 21339ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks bool MarkAsSink, 21439ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks ExplodedNode *P = 0, 21539ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks const ProgramPointTag *Tag = 0) { 216c8bb3befcad8cd8fc9556bc265289b07dc3c94c8Anna Zaks if (!State || (State == Pred->getState() && !Tag && !MarkAsSink)) 217df95d146c13cf02e106b32b01d147577d6d6b5a1Anna Zaks return Pred; 218df95d146c13cf02e106b32b01d147577d6d6b5a1Anna Zaks 21957300760964904cc022a175643342f29f46b7e6bAnna Zaks Changed = true; 22039ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks ExplodedNode *node = NB.generateNode(Tag ? Location.withTag(Tag) : Location, 22139ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks State, 22239ac1876f6f9a1a8e0070f0df61036c7ba05202bAnna Zaks P ? P : Pred, MarkAsSink); 2236bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis return node; 2246bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis } 2256bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis}; 2266bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 22757300760964904cc022a175643342f29f46b7e6bAnna Zaks/// \brief A helper class which wraps a boolean value set to false by default. 22857300760964904cc022a175643342f29f46b7e6bAnna Zaksstruct DefaultBool { 22957300760964904cc022a175643342f29f46b7e6bAnna Zaks bool Val; 23057300760964904cc022a175643342f29f46b7e6bAnna Zaks DefaultBool() : Val(false) {} 23157300760964904cc022a175643342f29f46b7e6bAnna Zaks operator bool() const { return Val; } 23257300760964904cc022a175643342f29f46b7e6bAnna Zaks DefaultBool &operator=(bool b) { Val = b; return *this; } 23357300760964904cc022a175643342f29f46b7e6bAnna Zaks}; 23457300760964904cc022a175643342f29f46b7e6bAnna Zaks 2356bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // end GR namespace 2366bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 2376bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // end clang namespace 2386bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 2396bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#endif 240