r361978 - [analyzer] print() JSONify: Constraints implementation
Csaba Dabis via cfe-commits
cfe-commits at lists.llvm.org
Wed May 29 08:43:26 PDT 2019
Author: charusso
Date: Wed May 29 08:43:26 2019
New Revision: 361978
URL: http://llvm.org/viewvc/llvm-project?rev=361978&view=rev
Log:
[analyzer] print() JSONify: Constraints implementation
Summary: -
Reviewers: NoQ, xazax.hun, ravikandhadai, baloghadamsoftware, Szelethus
Reviewed By: NoQ
Subscribers: szepet, rnkovacs, a.sidorin, mikhail.ramalho, donat.nagy,
dkrupp
Tags: #clang
Differential Revision: https://reviews.llvm.org/D62082
Modified:
cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h
cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConstraintManager.h
cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp
cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
cfe/trunk/test/Analysis/expr-inspection.c
Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h?rev=361978&r1=361977&r2=361978&view=diff
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h Wed May 29 08:43:26 2019
@@ -162,10 +162,9 @@ public:
virtual ProgramStateRef removeDeadBindings(ProgramStateRef state,
SymbolReaper& SymReaper) = 0;
- virtual void print(ProgramStateRef state,
- raw_ostream &Out,
- const char* nl,
- const char *sep) = 0;
+ virtual void printJson(raw_ostream &Out, ProgramStateRef State,
+ const char *NL, unsigned int Space,
+ bool IsDot) const = 0;
virtual void EndPath(ProgramStateRef state) {}
Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConstraintManager.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConstraintManager.h?rev=361978&r1=361977&r2=361978&view=diff
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConstraintManager.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConstraintManager.h Wed May 29 08:43:26 2019
@@ -14,6 +14,7 @@
#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SMTCONSTRAINTMANAGER_H
#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SMTCONSTRAINTMANAGER_H
+#include "clang/Basic/JsonSupport.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/RangedConstraintManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h"
@@ -208,17 +209,32 @@ public:
return State->set<ConstraintSMT>(CZ);
}
- void print(ProgramStateRef St, raw_ostream &OS, const char *nl,
- const char *sep) override {
-
- auto CZ = St->get<ConstraintSMT>();
+ void printJson(raw_ostream &Out, ProgramStateRef State, const char *NL = "\n",
+ unsigned int Space = 0, bool IsDot = false) const override {
+ ConstraintSMTType Constraints = State->get<ConstraintSMT>();
+
+ Indent(Out, Space, IsDot) << "\"constraints\": ";
+ if (Constraints.isEmpty()) {
+ Out << "null," << NL;
+ return;
+ }
- OS << nl << sep << "Constraints:";
- for (auto I = CZ.begin(), E = CZ.end(); I != E; ++I) {
- OS << nl << ' ' << I->first << " : ";
- I->second->print(OS);
+ ++Space;
+ Out << '[' << NL;
+ for (ConstraintSMTType::iterator I = Constraints.begin();
+ I != Constraints.end(); ++I) {
+ Indent(Out, Space, IsDot)
+ << "{ \"symbol\": \"" << I->first << "\", \"range\": \"";
+ I->second->print(Out);
+ Out << "\" }";
+
+ if (std::next(I) != Constraints.end())
+ Out << ',';
+ Out << NL;
}
- OS << nl;
+
+ --Space;
+ Indent(Out, Space, IsDot) << "],";
}
bool haveEqualConstraints(ProgramStateRef S1,
Modified: cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp?rev=361978&r1=361977&r2=361978&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp Wed May 29 08:43:26 2019
@@ -452,7 +452,7 @@ void ProgramState::printJson(raw_ostream
Env.printJson(Out, Context, LCtx, NL, Space, IsDot);
// Print out the constraints.
- Mgr.getConstraintManager().print(this, Out, NL, Sep);
+ Mgr.getConstraintManager().printJson(Out, this, NL, Space, IsDot);
// Print out the tracked dynamic types.
printDynamicTypeInfo(this, Out, NL, Sep);
Modified: cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp?rev=361978&r1=361977&r2=361978&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp Wed May 29 08:43:26 2019
@@ -11,6 +11,7 @@
//
//===----------------------------------------------------------------------===//
+#include "clang/Basic/JsonSupport.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
@@ -261,8 +262,8 @@ public:
ProgramStateRef removeDeadBindings(ProgramStateRef State,
SymbolReaper &SymReaper) override;
- void print(ProgramStateRef State, raw_ostream &Out, const char *nl,
- const char *sep) override;
+ void printJson(raw_ostream &Out, ProgramStateRef State, const char *NL = "\n",
+ unsigned int Space = 0, bool IsDot = false) const override;
//===------------------------------------------------------------------===//
// Implementation for interface from RangedConstraintManager.
@@ -754,25 +755,35 @@ ProgramStateRef RangeConstraintManager::
return New.isEmpty() ? nullptr : State->set<ConstraintRange>(Sym, New);
}
-//===------------------------------------------------------------------------===
+//===----------------------------------------------------------------------===//
// Pretty-printing.
-//===------------------------------------------------------------------------===/
-
-void RangeConstraintManager::print(ProgramStateRef St, raw_ostream &Out,
- const char *nl, const char *sep) {
-
- ConstraintRangeTy Ranges = St->get<ConstraintRange>();
+//===----------------------------------------------------------------------===//
- if (Ranges.isEmpty()) {
- Out << nl << sep << "Ranges are empty." << nl;
+void RangeConstraintManager::printJson(raw_ostream &Out, ProgramStateRef State,
+ const char *NL, unsigned int Space,
+ bool IsDot) const {
+ ConstraintRangeTy Constraints = State->get<ConstraintRange>();
+
+ Indent(Out, Space, IsDot) << "\"constraints\": ";
+ if (Constraints.isEmpty()) {
+ Out << "null," << NL;
return;
}
- Out << nl << sep << "Ranges of symbol values:";
- for (ConstraintRangeTy::iterator I = Ranges.begin(), E = Ranges.end(); I != E;
- ++I) {
- Out << nl << ' ' << I.getKey() << " : ";
+ ++Space;
+ Out << '[' << NL;
+ for (ConstraintRangeTy::iterator I = Constraints.begin();
+ I != Constraints.end(); ++I) {
+ Indent(Out, Space, IsDot)
+ << "{ \"symbol\": \"" << I.getKey() << "\", \"range\": \"";
I.getData().print(Out);
+ Out << "\" }";
+
+ if (std::next(I) != Constraints.end())
+ Out << ',';
+ Out << NL;
}
- Out << nl;
+
+ --Space;
+ Indent(Out, Space, IsDot) << "]," << NL;
}
Modified: cfe/trunk/test/Analysis/expr-inspection.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/expr-inspection.c?rev=361978&r1=361977&r2=361978&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/expr-inspection.c (original)
+++ cfe/trunk/test/Analysis/expr-inspection.c Wed May 29 08:43:26 2019
@@ -33,6 +33,7 @@ void foo(int x) {
// CHECK-NEXT: { "lctx_id": 1, "stmt_id": 847, "pretty": "clang_analyzer_printState", "value": "&code{clang_analyzer_printState}" }
// CHECK-NEXT: ]}
// CHECK-NEXT: ],
+// CHECK-NEXT: "constraints": [
+// CHECK-NEXT: { "symbol": "reg_$0<int x>", "range": "{ [-2147483648, 13] }" }
+// CHECK-NEXT: ],
-// CHECK: Ranges of symbol values:
-// CHECK-NEXT: reg_$0<int x> : { [-2147483648, 13] }
More information about the cfe-commits
mailing list