[analyzer][z3] Use more elaborate Z3 variable names

Previously, it was a tedious task to comprehend Z3 dumps.
We will use the same name prefix just as we use in the corresponding dump method

For all `SymbolData` values:
    `$###` -> `conj_$###`
    `$###` -> `derived_$###`
    `$###` -> `extent_$###`
    `$###` -> `meta_$###`
    `$###` -> `reg_$###`

Reviewed By: xazax.hun,mikhail.ramalho

Differential Revision: https://reviews.llvm.org/D86223
This commit is contained in:
Balazs Benics 2020-09-14 08:43:56 +02:00
parent d7ae9696e3
commit cdacffe4ac
6 changed files with 56 additions and 17 deletions

View File

@ -122,8 +122,7 @@ public:
// this method tries to get the interpretation (the actual value) from
// the solver, which is currently not cached.
llvm::SMTExprRef Exp =
SMTConv::fromData(Solver, SD->getSymbolID(), Ty, Ctx.getTypeSize(Ty));
llvm::SMTExprRef Exp = SMTConv::fromData(Solver, Ctx, SD);
Solver->reset();
addStateConstraints(State);

View File

@ -319,11 +319,16 @@ public:
}
/// Construct an SMTSolverRef from a SymbolData.
static inline llvm::SMTExprRef fromData(llvm::SMTSolverRef &Solver,
const SymbolID ID, const QualType &Ty,
uint64_t BitWidth) {
llvm::Twine Name = "$" + llvm::Twine(ID);
return Solver->mkSymbol(Name.str().c_str(), mkSort(Solver, Ty, BitWidth));
static inline llvm::SMTExprRef
fromData(llvm::SMTSolverRef &Solver, ASTContext &Ctx, const SymbolData *Sym) {
const SymbolID ID = Sym->getSymbolID();
const QualType Ty = Sym->getType();
const uint64_t BitWidth = Ctx.getTypeSize(Ty);
llvm::SmallString<16> Str;
llvm::raw_svector_ostream OS(Str);
OS << Sym->getKindStr() << ID;
return Solver->mkSymbol(Str.c_str(), mkSort(Solver, Ty, BitWidth));
}
// Wrapper to generate SMTSolverRef from SymbolCast data.
@ -422,8 +427,7 @@ public:
if (RetTy)
*RetTy = Sym->getType();
return fromData(Solver, SD->getSymbolID(), Sym->getType(),
Ctx.getTypeSize(Sym->getType()));
return fromData(Solver, Ctx, SD);
}
if (const SymbolCast *SC = dyn_cast<SymbolCast>(Sym)) {

View File

@ -126,6 +126,9 @@ protected:
public:
~SymbolData() override = default;
/// Get a string representation of the kind of the region.
virtual StringRef getKindStr() const = 0;
SymbolID getSymbolID() const { return Sym; }
unsigned computeComplexity() const override {

View File

@ -59,6 +59,8 @@ public:
Profile(profile, R);
}
StringRef getKindStr() const override;
void dumpToStream(raw_ostream &os) const override;
const MemRegion *getOriginRegion() const override { return getRegion(); }
@ -99,6 +101,8 @@ public:
QualType getType() const override;
StringRef getKindStr() const override;
void dumpToStream(raw_ostream &os) const override;
static void Profile(llvm::FoldingSetNodeID& profile, const Stmt *S,
@ -141,6 +145,8 @@ public:
QualType getType() const override;
StringRef getKindStr() const override;
void dumpToStream(raw_ostream &os) const override;
const MemRegion *getOriginRegion() const override { return getRegion(); }
@ -177,6 +183,8 @@ public:
QualType getType() const override;
StringRef getKindStr() const override;
void dumpToStream(raw_ostream &os) const override;
static void Profile(llvm::FoldingSetNodeID& profile, const SubRegion *R) {
@ -226,6 +234,8 @@ public:
QualType getType() const override;
StringRef getKindStr() const override;
void dumpToStream(raw_ostream &os) const override;
static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion *R,

View File

@ -35,6 +35,12 @@ using namespace ento;
void SymExpr::anchor() {}
StringRef SymbolConjured::getKindStr() const { return "conj_$"; }
StringRef SymbolDerived::getKindStr() const { return "derived_$"; }
StringRef SymbolExtent::getKindStr() const { return "extent_$"; }
StringRef SymbolMetadata::getKindStr() const { return "meta_$"; }
StringRef SymbolRegionValue::getKindStr() const { return "reg_$"; }
LLVM_DUMP_METHOD void SymExpr::dump() const { dumpToStream(llvm::errs()); }
void BinarySymExpr::dumpToStreamImpl(raw_ostream &OS, const SymExpr *Sym) {
@ -65,7 +71,7 @@ void SymbolCast::dumpToStream(raw_ostream &os) const {
}
void SymbolConjured::dumpToStream(raw_ostream &os) const {
os << "conj_$" << getSymbolID() << '{' << T.getAsString() << ", LC"
os << getKindStr() << getSymbolID() << '{' << T.getAsString() << ", LC"
<< LCtx->getID();
if (S)
os << ", S" << S->getID(LCtx->getDecl()->getASTContext());
@ -75,24 +81,24 @@ void SymbolConjured::dumpToStream(raw_ostream &os) const {
}
void SymbolDerived::dumpToStream(raw_ostream &os) const {
os << "derived_$" << getSymbolID() << '{'
<< getParentSymbol() << ',' << getRegion() << '}';
os << getKindStr() << getSymbolID() << '{' << getParentSymbol() << ','
<< getRegion() << '}';
}
void SymbolExtent::dumpToStream(raw_ostream &os) const {
os << "extent_$" << getSymbolID() << '{' << getRegion() << '}';
os << getKindStr() << getSymbolID() << '{' << getRegion() << '}';
}
void SymbolMetadata::dumpToStream(raw_ostream &os) const {
os << "meta_$" << getSymbolID() << '{'
<< getRegion() << ',' << T.getAsString() << '}';
os << getKindStr() << getSymbolID() << '{' << getRegion() << ','
<< T.getAsString() << '}';
}
void SymbolData::anchor() {}
void SymbolRegionValue::dumpToStream(raw_ostream &os) const {
os << "reg_$" << getSymbolID()
<< '<' << getType().getAsString() << ' ' << R << '>';
os << getKindStr() << getSymbolID() << '<' << getType().getAsString() << ' '
<< R << '>';
}
bool SymExpr::symbol_iterator::operator==(const symbol_iterator &X) const {

View File

@ -0,0 +1,17 @@
// RUN: %clang_cc1 -analyze -analyzer-constraints=z3 -setup-static-analyzer \
// RUN: -analyzer-checker=core,debug.ExprInspection %s 2>&1 | FileCheck %s
//
// REQUIRES: z3
//
// Works only with the z3 constraint manager.
void clang_analyzer_printState();
void foo(int x) {
if (x == 3) {
clang_analyzer_printState();
(void)x;
// CHECK: "constraints": [
// CHECK-NEXT: { "symbol": "(reg_$[[#]]<int x>) == 3", "range": "(= reg_$[[#]] #x00000003)" }
}
}