]> granicus.if.org Git - clang/commitdiff
[analyzer] Dump reproducible identifiers for statements in exploded graph in store
authorGeorge Karpenkov <ekarpenkov@apple.com>
Sat, 15 Sep 2018 02:03:17 +0000 (02:03 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Sat, 15 Sep 2018 02:03:17 +0000 (02:03 +0000)
Differential Revision: https://reviews.llvm.org/D51826

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342313 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Core/PathSensitive/Environment.h
lib/StaticAnalyzer/Core/Environment.cpp
lib/StaticAnalyzer/Core/ExprEngine.cpp
lib/StaticAnalyzer/Core/ProgramState.cpp

index 77e35398077c7944a11137b77549e5d810a80450..6d498031bea0ca115d8af79425d88274f6519670 100644 (file)
@@ -93,6 +93,7 @@ public:
   }
 
   void print(raw_ostream &Out, const char *NL, const char *Sep,
+             const ASTContext &Context,
              const LocationContext *WithLC = nullptr) const;
 };
 
index eccaee292c403c5b9e6dcb67a8473d50ed30faf2..5f1a37c8d6c4e971de92ad1ae20825edc5e382d9 100644 (file)
@@ -202,7 +202,9 @@ EnvironmentManager::removeDeadBindings(Environment Env,
 }
 
 void Environment::print(raw_ostream &Out, const char *NL,
-                        const char *Sep, const LocationContext *WithLC) const {
+                        const char *Sep,
+                        const ASTContext &Context,
+                        const LocationContext *WithLC) const {
   if (ExprBindings.isEmpty())
     return;
 
@@ -222,8 +224,7 @@ void Environment::print(raw_ostream &Out, const char *NL,
 
   assert(WithLC);
 
-  LangOptions LO; // FIXME.
-  PrintingPolicy PP(LO);
+  PrintingPolicy PP = Context.getPrintingPolicy();
 
   Out << NL << NL << "Expressions by stack frame:" << NL;
   WithLC->dumpStack(Out, "", NL, Sep, [&](const LocationContext *LC) {
@@ -234,8 +235,9 @@ void Environment::print(raw_ostream &Out, const char *NL,
       const Stmt *S = I.first.getStmt();
       assert(S != nullptr && "Expected non-null Stmt");
 
-      Out << "(" << (const void *)LC << ',' << (const void *)S << ") ";
-      S->printPretty(Out, nullptr, PP);
+      Out << "(LC" << (const void *)LC << ", S" << S->getID(Context) << " <"
+          << (const void *)S << "> ) ";
+      S->printPretty(Out, /*Helper=*/nullptr, PP);
       Out << " : " << I.second << NL;
     }
   });
index b8ec06e9b98dd3a7a87c9a656aa976c58612f7fd..a0cb43284df5ee52883564efbbc1c0f444a36d24 100644 (file)
@@ -3109,7 +3109,7 @@ struct DOTGraphTraits<ExplodedNode*> : public DefaultDOTGraphTraits {
       assert(S != nullptr && "Expecting non-null Stmt");
 
       Out << S->getStmtClassName() << ' '
-          << S->getID(Context) << " (" << (const void *)S << ") ";
+          << S->getID(Context) << " <" << (const void *)S << "> ";
       S->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
                      /*Indentation=*/2, /*NewlineSymbol=*/"\\l");
       printLocation(Out, S->getBeginLoc());
@@ -3171,9 +3171,9 @@ struct DOTGraphTraits<ExplodedNode*> : public DefaultDOTGraphTraits {
         static_cast<ExprEngine *>(State->getStateManager().getOwningEngine())
             ->getGraph();
 
-    Out << "StateID: " << State->getID() << " (" << (const void *)State.get()
-        << ")"
-        << " NodeID: " << N->getID(&Graph) << " (" << (const void *)N << ")\\|";
+    Out << "StateID: " << State->getID() << " <" << (const void *)State.get()
+        << ">"
+        << " NodeID: " << N->getID(&Graph) << " <" << (const void *)N << ">\\|";
 
     bool SameAsAllPredecessors =
         std::all_of(N->pred_begin(), N->pred_end(), [&](const ExplodedNode *P) {
index 361255b4b18e93976cae1e3edc58d59340678070..01c1c8c61872aeda0ea9d7b40d456a655cf93e70 100644 (file)
@@ -456,14 +456,16 @@ void ProgramState::setStore(const StoreRef &newStore) {
 //  State pretty-printing.
 //===----------------------------------------------------------------------===//
 
-void ProgramState::print(raw_ostream &Out, const char *NL, const char *Sep,
+void ProgramState::print(raw_ostream &Out,
+                         const char *NL, const char *Sep,
                          const LocationContext *LC) const {
   // Print the store.
   ProgramStateManager &Mgr = getStateManager();
+  const ASTContext &Context = getStateManager().getContext();
   Mgr.getStoreManager().print(getStore(), Out, NL, Sep);
 
   // Print out the environment.
-  Env.print(Out, NL, Sep, LC);
+  Env.print(Out, NL, Sep, Context, LC);
 
   // Print out the constraints.
   Mgr.getConstraintManager().print(this, Out, NL, Sep);
@@ -478,7 +480,8 @@ void ProgramState::print(raw_ostream &Out, const char *NL, const char *Sep,
   Mgr.getOwningEngine()->printState(Out, this, NL, Sep, LC);
 }
 
-void ProgramState::printDOT(raw_ostream &Out, const LocationContext *LC) const {
+void ProgramState::printDOT(raw_ostream &Out,
+                            const LocationContext *LC) const {
   print(Out, "\\l", "\\|", LC);
 }