From: Ted Kremenek Date: Wed, 22 Jul 2009 21:39:25 +0000 (+0000) Subject: Add 'PreStmt' program point. This will be used to represent checking for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cdd4f1783da7c7565be2376d14ca6ab2625aa4b6;p=clang Add 'PreStmt' program point. This will be used to represent checking for preconditions (in GRExprEngine) before the statement itself is evaluated. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76791 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/ProgramPoint.h b/include/clang/Analysis/ProgramPoint.h index 1c6f998b9c..a22fd25f28 100644 --- a/include/clang/Analysis/ProgramPoint.h +++ b/include/clang/Analysis/ProgramPoint.h @@ -27,20 +27,21 @@ namespace clang { class ProgramPoint { public: - enum Kind { BlockEdgeKind = 0x0, - BlockEntranceKind = 0x1, - BlockExitKind = 0x2, - // Keep the following four together and in this order. - PostStmtKind = 0x3, - PostLocationChecksSucceedKind = 0x4, - PostOutOfBoundsCheckFailedKind = 0x5, - PostNullCheckFailedKind = 0x6, - PostUndefLocationCheckFailedKind = 0x7, - PostLoadKind = 0x8, - PostStoreKind = 0x9, - PostPurgeDeadSymbolsKind = 0x10, - PostStmtCustomKind = 0x11, - PostLValueKind = 0x12, + enum Kind { BlockEdgeKind, + BlockEntranceKind, + BlockExitKind, + PreStmtKind, + // Keep the following together and in this order. + PostStmtKind, + PostLocationChecksSucceedKind, + PostOutOfBoundsCheckFailedKind, + PostNullCheckFailedKind, + PostUndefLocationCheckFailedKind, + PostLoadKind, + PostStoreKind, + PostPurgeDeadSymbolsKind, + PostStmtCustomKind, + PostLValueKind, MinPostStmtKind = PostStmtKind, MaxPostStmtKind = PostLValueKind }; @@ -130,9 +131,25 @@ public: } }; +class PreStmt : public ProgramPoint { +public: + PreStmt(const Stmt *S, const void *tag, const Stmt *SubStmt = 0) + : ProgramPoint(S, SubStmt, PreStmtKind, tag) {} + + const Stmt *getStmt() const { return (const Stmt*) getData1(); } + const Stmt *getSubStmt() const { return (const Stmt*) getData2(); } + + template + const T* getStmtAs() const { return llvm::dyn_cast(getStmt()); } + + static bool classof(const ProgramPoint* Location) { + return Location->getKind() == PreStmtKind; + } +}; + class PostStmt : public ProgramPoint { protected: - PostStmt(const Stmt* S, Kind k,const void *tag = 0) + PostStmt(const Stmt* S, Kind k, const void *tag = 0) : ProgramPoint(S, k, tag) {} PostStmt(const Stmt* S, const void* data, Kind k, const void *tag =0)