From: George Karpenkov Date: Thu, 6 Sep 2018 23:07:26 +0000 (+0000) Subject: [analyzer] Dump a reproducible, deterministic ID of program state to exploded graph X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cc7b7584b5a4ef1071f03ce51b2f8cbfcbff329c;p=clang [analyzer] Dump a reproducible, deterministic ID of program state to exploded graph Differential Revision: https://reviews.llvm.org/D51395 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341600 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index b86301a034..6aaa1e53fe 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -107,6 +107,8 @@ public: ~ProgramState(); + int64_t getID() const; + /// Return the ProgramStateManager associated with this state. ProgramStateManager &getStateManager() const { return *stateMgr; diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 04190deb7a..a9901a6cd7 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -3141,7 +3141,8 @@ struct DOTGraphTraits : public DefaultDOTGraphTraits { } ProgramStateRef state = N->getState(); - Out << "\\|StateID: " << (const void*) state.get() + Out << "\\|StateID: " << state->getID() << " (" + << (const void*) state.get() << ")" << " NodeID: " << (const void*) N << "\\|"; state->printDOT(Out, N->getLocationContext()); diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index 94e2e00d8b..361255b4b1 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -69,6 +69,13 @@ ProgramState::~ProgramState() { stateMgr->getStoreManager().decrementReferenceCount(store); } +int64_t ProgramState::getID() const { + Optional Out = getStateManager().Alloc.identifyObject(this); + assert(Out && "Wrong allocator used"); + assert(*Out % alignof(ProgramState) == 0 && "Wrong alignment information"); + return *Out / alignof(ProgramState); +} + ProgramStateManager::ProgramStateManager(ASTContext &Ctx, StoreManagerCreator CreateSMgr, ConstraintManagerCreator CreateCMgr,