/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ // SPDX-License-Identifier: GPL-3.0 #include #include #include using namespace std; using namespace solidity::util; using namespace solidity::smtutil; namespace solidity::frontend::smt { SortPointer interfaceSort(ContractDefinition const& _contract, SymbolicState& _state) { return make_shared( vector{_state.thisAddressSort(), _state.cryptoSort(), _state.stateSort()} + stateSorts(_contract), SortProvider::boolSort ); } SortPointer nondetInterfaceSort(ContractDefinition const& _contract, SymbolicState& _state) { auto varSorts = stateSorts(_contract); vector stateSort{_state.stateSort()}; return make_shared( stateSort + varSorts + stateSort + varSorts, SortProvider::boolSort ); } SortPointer implicitConstructorSort(SymbolicState& _state) { return make_shared( vector{_state.errorFlagSort(), _state.thisAddressSort(), _state.cryptoSort(), _state.txSort(), _state.stateSort()}, SortProvider::boolSort ); } SortPointer constructorSort(ContractDefinition const& _contract, SymbolicState& _state) { if (auto const* constructor = _contract.constructor()) return functionSort(*constructor, &_contract, _state); return make_shared( vector{_state.errorFlagSort(), _state.thisAddressSort(), _state.cryptoSort(), _state.txSort(), _state.stateSort(), _state.stateSort()} + stateSorts(_contract), SortProvider::boolSort ); } SortPointer functionSort(FunctionDefinition const& _function, ContractDefinition const* _contract, SymbolicState& _state) { auto smtSort = [](auto _var) { return smt::smtSortAbstractFunction(*_var->type()); }; auto varSorts = _contract ? stateSorts(*_contract) : vector{}; auto inputSorts = applyMap(_function.parameters(), smtSort); auto outputSorts = applyMap(_function.returnParameters(), smtSort); return make_shared( vector{_state.errorFlagSort(), _state.thisAddressSort(), _state.cryptoSort(), _state.txSort(), _state.stateSort()} + varSorts + inputSorts + vector{_state.stateSort()} + varSorts + inputSorts + outputSorts, SortProvider::boolSort ); } SortPointer functionBodySort(FunctionDefinition const& _function, ContractDefinition const* _contract, SymbolicState& _state) { auto fSort = dynamic_pointer_cast(functionSort(_function, _contract, _state)); solAssert(fSort, ""); auto smtSort = [](auto _var) { return smt::smtSortAbstractFunction(*_var->type()); }; return make_shared( fSort->domain + applyMap(_function.localVariables(), smtSort), SortProvider::boolSort ); } SortPointer arity0FunctionSort() { return make_shared( vector(), SortProvider::boolSort ); } /// Helpers vector stateSorts(ContractDefinition const& _contract) { return applyMap( SMTEncoder::stateVariablesIncludingInheritedAndPrivate(_contract), [](auto _var) { return smt::smtSortAbstractFunction(*_var->type()); } ); } }