14#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SMTCONSTRAINTMANAGER_H
15#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SMTCONSTRAINTMANAGER_H
24typedef llvm::ImmutableSet<
25 std::pair<clang::ento::SymbolRef, const llvm::SMTExpr *>>
33 mutable llvm::SMTSolverRef Solver = llvm::CreateZ3Solver();
39 Solver->setBoolParam(
"model",
true);
40 Solver->setUnsignedParam(
"timeout", 15000 );
49 bool Assumption)
override {
55 llvm::SMTExprRef Exp =
65 return assumeExpr(State, Sym, Assumption ? Exp : Solver->mkNot(Exp));
69 const llvm::APSInt &From,
70 const llvm::APSInt &To,
71 bool InRange)
override {
78 bool Assumption)
override {
93 llvm::SMTExprRef Exp =
97 llvm::SMTExprRef NotExp =
120 if (
const SymbolData *SD = dyn_cast<SymbolData>(Sym)) {
123 llvm::APSInt
Value(Ctx.getTypeSize(Ty),
136 std::optional<bool> isSat = Solver->check();
137 if (!isSat || !*isSat)
141 if (!Solver->getInterpretation(Exp,
Value))
148 : Solver->mkBitvector(
Value,
Value.getBitWidth()),
151 Solver->addConstraint(NotExp);
153 std::optional<bool> isNotSat = Solver->check();
154 if (!isNotSat || *isNotSat)
161 if (
const SymbolCast *SC = dyn_cast<SymbolCast>(Sym)) {
168 const llvm::APSInt *
Value;
174 if (
const BinarySymExpr *BSE = dyn_cast<BinarySymExpr>(Sym)) {
175 const llvm::APSInt *LHS, *RHS;
176 if (
const SymIntExpr *SIE = dyn_cast<SymIntExpr>(BSE)) {
178 RHS = SIE->getRHS().get();
179 }
else if (
const IntSymExpr *ISE = dyn_cast<IntSymExpr>(BSE)) {
180 LHS = ISE->getLHS().get();
182 }
else if (
const SymSymExpr *SSM = dyn_cast<SymSymExpr>(BSE)) {