mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #10763 from blishko/smt-abi-fixes
[SMTChecker] Small fixes in handling ABI functions
This commit is contained in:
commit
110e0e1f25
@ -773,7 +773,7 @@ void SMTEncoder::visitABIFunction(FunctionCall const& _funCall)
|
|||||||
|
|
||||||
optional<smtutil::Expression> arg;
|
optional<smtutil::Expression> arg;
|
||||||
if (inTypes.size() == 1)
|
if (inTypes.size() == 1)
|
||||||
arg = expr(*args.at(0));
|
arg = expr(*args.at(0), inTypes.at(0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto inputSort = dynamic_cast<smtutil::ArraySort&>(*symbFunction.sort).domain;
|
auto inputSort = dynamic_cast<smtutil::ArraySort&>(*symbFunction.sort).domain;
|
||||||
|
@ -203,15 +203,20 @@ void SymbolicState::buildABIFunctions(set<FunctionCall const*> const& _abiFuncti
|
|||||||
if (t->kind() == FunctionType::Kind::ABIDecode)
|
if (t->kind() == FunctionType::Kind::ABIDecode)
|
||||||
{
|
{
|
||||||
/// abi.decode : (bytes, tuple_of_types(return_types)) -> (return_types)
|
/// abi.decode : (bytes, tuple_of_types(return_types)) -> (return_types)
|
||||||
|
solAssert(args.size() == 2, "Unexpected number of arguments for abi.decode");
|
||||||
inTypes.emplace_back(TypeProvider::bytesMemory());
|
inTypes.emplace_back(TypeProvider::bytesMemory());
|
||||||
auto const* tupleType = dynamic_cast<TupleType const*>(args.at(1)->annotation().type);
|
auto argType = args.at(1)->annotation().type;
|
||||||
solAssert(tupleType, "");
|
if (auto const* tupleType = dynamic_cast<TupleType const*>(argType))
|
||||||
for (auto t: tupleType->components())
|
for (auto componentType: tupleType->components())
|
||||||
{
|
{
|
||||||
auto typeType = dynamic_cast<TypeType const*>(t);
|
auto typeType = dynamic_cast<TypeType const*>(componentType);
|
||||||
solAssert(typeType, "");
|
solAssert(typeType, "");
|
||||||
outTypes.emplace_back(typeType->actualType());
|
outTypes.emplace_back(typeType->actualType());
|
||||||
}
|
}
|
||||||
|
else if (auto const* typeType = dynamic_cast<TypeType const*>(argType))
|
||||||
|
outTypes.emplace_back(typeType->actualType());
|
||||||
|
else
|
||||||
|
solAssert(false, "Unexpected argument of abi.decode");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -264,14 +269,14 @@ void SymbolicState::buildABIFunctions(set<FunctionCall const*> const& _abiFuncti
|
|||||||
/// Otherwise we create a tuple wrapping the necessary input or output types.
|
/// Otherwise we create a tuple wrapping the necessary input or output types.
|
||||||
auto typesToSort = [](auto const& _types, string const& _name) -> shared_ptr<Sort> {
|
auto typesToSort = [](auto const& _types, string const& _name) -> shared_ptr<Sort> {
|
||||||
if (_types.size() == 1)
|
if (_types.size() == 1)
|
||||||
return smtSort(*_types.front());
|
return smtSortAbstractFunction(*_types.front());
|
||||||
|
|
||||||
vector<string> inNames;
|
vector<string> inNames;
|
||||||
vector<SortPointer> sorts;
|
vector<SortPointer> sorts;
|
||||||
for (unsigned i = 0; i < _types.size(); ++i)
|
for (unsigned i = 0; i < _types.size(); ++i)
|
||||||
{
|
{
|
||||||
inNames.emplace_back(_name + "_input_" + to_string(i));
|
inNames.emplace_back(_name + "_input_" + to_string(i));
|
||||||
sorts.emplace_back(smtSort(*_types.at(i)));
|
sorts.emplace_back(smtSortAbstractFunction(*_types.at(i)));
|
||||||
}
|
}
|
||||||
return make_shared<smtutil::TupleSort>(
|
return make_shared<smtutil::TupleSort>(
|
||||||
_name + "_input",
|
_name + "_input",
|
||||||
|
11
test/libsolidity/smtCheckerTests/abi/abi_decode_1_tuple.sol
Normal file
11
test/libsolidity/smtCheckerTests/abi/abi_decode_1_tuple.sol
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
pragma experimental SMTChecker;
|
||||||
|
contract C {
|
||||||
|
function f(bytes calldata data) external pure returns (uint256[] memory) {
|
||||||
|
return abi.decode(data, (uint256[]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 8364: (148-157): Assertion checker does not yet implement type type(uint256[] memory)
|
||||||
|
// Warning 8364: (147-158): Assertion checker does not yet implement type type(uint256[] memory)
|
||||||
|
// Warning 8364: (148-157): Assertion checker does not yet implement type type(uint256[] memory)
|
||||||
|
// Warning 8364: (147-158): Assertion checker does not yet implement type type(uint256[] memory)
|
@ -0,0 +1,9 @@
|
|||||||
|
pragma experimental SMTChecker;
|
||||||
|
contract C {
|
||||||
|
function f() public view {
|
||||||
|
abi.encode(this.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6031: (86-92): Internal error: Expression undefined for SMT solver.
|
||||||
|
// Warning 6031: (86-92): Internal error: Expression undefined for SMT solver.
|
@ -0,0 +1,9 @@
|
|||||||
|
pragma experimental SMTChecker;
|
||||||
|
contract C {
|
||||||
|
function abiEncodeStringLiteral(bytes4 sel) public pure {
|
||||||
|
bytes memory b1 = abi.encodeWithSelector("");
|
||||||
|
require(sel == "");
|
||||||
|
bytes memory b2 = abi.encodeWithSelector(sel);
|
||||||
|
assert(b1.length == b2.length); // should hold
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user