Skip to content

Commit a448921

Browse files
committed
SMTChecker: Move helper function towards its only usage
We don't need a separate file for a single, relatively small, helper function.
1 parent a04f946 commit a448921

File tree

4 files changed

+53
-125
lines changed

4 files changed

+53
-125
lines changed

libsolidity/CMakeLists.txt

-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ set(sources
117117
formal/EncodingContext.h
118118
formal/ExpressionFormatter.cpp
119119
formal/ExpressionFormatter.h
120-
formal/Invariants.cpp
121-
formal/Invariants.h
122120
formal/ModelChecker.cpp
123121
formal/ModelChecker.h
124122
formal/ModelCheckerSettings.cpp

libsolidity/formal/CHC.cpp

+53-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
#include <libsolidity/formal/CHC.h>
2020

2121
#include <libsolidity/formal/ArraySlicePredicate.h>
22+
#include <libsolidity/formal/ExpressionFormatter.h>
2223
#include <libsolidity/formal/EldaricaCHCSmtLib2Interface.h>
23-
#include <libsolidity/formal/Invariants.h>
2424
#include <libsolidity/formal/ModelChecker.h>
2525
#include <libsolidity/formal/PredicateInstance.h>
2626
#include <libsolidity/formal/PredicateSort.h>
@@ -2134,6 +2134,58 @@ void CHC::checkVerificationTargets()
21342134
m_safeTargets[m_verificationTargets.at(id).errorNode].insert(m_verificationTargets.at(id));
21352135
}
21362136

2137+
namespace
2138+
{
2139+
std::map<Predicate const*, std::set<std::string>> collectInvariants(
2140+
smtutil::Expression const& _proof,
2141+
std::set<Predicate const*> const& _predicates,
2142+
ModelCheckerInvariants const& _invariantsSetting
2143+
)
2144+
{
2145+
std::set<std::string> targets;
2146+
if (_invariantsSetting.has(InvariantType::Contract))
2147+
targets.insert("interface_");
2148+
if (_invariantsSetting.has(InvariantType::Reentrancy))
2149+
targets.insert("nondet_interface_");
2150+
2151+
std::map<std::string, std::pair<smtutil::Expression, smtutil::Expression>> equalities;
2152+
// Collect equalities where one of the sides is a predicate we're interested in.
2153+
util::BreadthFirstSearch<smtutil::Expression const*>{{&_proof}}.run([&](auto&& _expr, auto&& _addChild) {
2154+
if (_expr->name == "=")
2155+
for (auto const& t: targets)
2156+
{
2157+
auto arg0 = _expr->arguments.at(0);
2158+
auto arg1 = _expr->arguments.at(1);
2159+
if (boost::algorithm::starts_with(arg0.name, t))
2160+
equalities.insert({arg0.name, {arg0, std::move(arg1)}});
2161+
else if (boost::algorithm::starts_with(arg1.name, t))
2162+
equalities.insert({arg1.name, {arg1, std::move(arg0)}});
2163+
}
2164+
for (auto const& arg: _expr->arguments)
2165+
_addChild(&arg);
2166+
});
2167+
2168+
std::map<Predicate const*, std::set<std::string>> invariants;
2169+
for (auto pred: _predicates)
2170+
{
2171+
auto predName = pred->functor().name;
2172+
if (!equalities.count(predName))
2173+
continue;
2174+
2175+
solAssert(pred->contextContract(), "");
2176+
2177+
auto const& [predExpr, invExpr] = equalities.at(predName);
2178+
2179+
static std::set<std::string> const ignore{"true", "false"};
2180+
auto r = substitute(invExpr, pred->expressionSubstitution(predExpr));
2181+
// No point in reporting true/false as invariants.
2182+
if (!ignore.count(r.name))
2183+
invariants[pred].insert(toSolidityStr(r));
2184+
}
2185+
return invariants;
2186+
}
2187+
} // namespace
2188+
21372189
void CHC::checkAndReportTarget(
21382190
CHCVerificationTarget const& _target,
21392191
std::vector<CHCQueryPlaceholder> const& _placeholders,

libsolidity/formal/Invariants.cpp

-85
This file was deleted.

libsolidity/formal/Invariants.h

-37
This file was deleted.

0 commit comments

Comments
 (0)