[SMTChecker] Correctly resolve current scope contract in VariableUsage.

This commit is contained in:
Martin Blicha
2021-03-15 13:55:14 +01:00
parent 2c00939ad8
commit 2f52affcc2
6 changed files with 53 additions and 4 deletions
-1
View File
@@ -782,7 +782,6 @@ void SMTEncoder::initFunction(FunctionDefinition const& _function)
createLocalVariables(_function);
m_arrayAssignmentHappened = false;
clearIndices(m_currentContract, &_function);
m_variableUsage.setCurrentFunction(_function);
m_checked = true;
}
+11 -1
View File
@@ -21,6 +21,8 @@
#include <libsolidity/formal/BMC.h>
#include <libsolidity/formal/SMTEncoder.h>
#include <range/v3/view.hpp>
#include <algorithm>
using namespace std;
@@ -60,7 +62,7 @@ void VariableUsage::endVisit(IndexAccess const& _indexAccess)
void VariableUsage::endVisit(FunctionCall const& _funCall)
{
auto scopeContract = m_currentFunction->annotation().contract;
auto scopeContract = currentScopeContract();
if (m_inlineFunctionCalls(_funCall, scopeContract, m_currentContract))
if (auto funDef = SMTEncoder::functionCallToDefinition(_funCall, scopeContract, m_currentContract))
if (find(m_callStack.begin(), m_callStack.end(), funDef) == m_callStack.end())
@@ -107,3 +109,11 @@ void VariableUsage::checkIdentifier(Identifier const& _identifier)
m_touchedVariables.insert(varDecl);
}
}
ContractDefinition const* VariableUsage::currentScopeContract()
{
for (auto&& f: m_callStack | ranges::views::reverse)
if (auto fun = dynamic_cast<FunctionDefinition const*>(f))
return fun->annotation().contract;
return nullptr;
}
+2 -2
View File
@@ -39,7 +39,6 @@ public:
void setFunctionInlining(std::function<bool(FunctionCall const&, ContractDefinition const*, ContractDefinition const*)> _inlineFunctionCalls) { m_inlineFunctionCalls = _inlineFunctionCalls; }
void setCurrentContract(ContractDefinition const& _contract) { m_currentContract = &_contract; }
void setCurrentFunction(FunctionDefinition const& _function) { m_currentFunction = &_function; }
private:
void endVisit(Identifier const& _node) override;
@@ -53,11 +52,12 @@ private:
/// Checks whether an identifier should be added to touchedVariables.
void checkIdentifier(Identifier const& _identifier);
ContractDefinition const* currentScopeContract();
std::set<VariableDeclaration const*> m_touchedVariables;
std::vector<CallableDeclaration const*> m_callStack;
CallableDeclaration const* m_lastCall = nullptr;
ContractDefinition const* m_currentContract = nullptr;
FunctionDefinition const* m_currentFunction = nullptr;
std::function<bool(FunctionCall const&, ContractDefinition const*, ContractDefinition const*)> m_inlineFunctionCalls = [](FunctionCall const&, ContractDefinition const*, ContractDefinition const*) { return false; };
};