mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #8611 from ethereum/smt_array_variable_sort
[SMTChecker] Allow constructing symbolic arrays from smt sort
This commit is contained in:
commit
0a72a3b8af
@ -218,15 +218,28 @@ SymbolicArrayVariable::SymbolicArrayVariable(
|
|||||||
solAssert(isArray(m_type->category()), "");
|
solAssert(isArray(m_type->category()), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SymbolicArrayVariable::SymbolicArrayVariable(
|
||||||
|
SortPointer _sort,
|
||||||
|
string _uniqueName,
|
||||||
|
EncodingContext& _context
|
||||||
|
):
|
||||||
|
SymbolicVariable(move(_sort), move(_uniqueName), _context)
|
||||||
|
{
|
||||||
|
solAssert(m_sort->kind == Kind::Array, "");
|
||||||
|
}
|
||||||
|
|
||||||
smt::Expression SymbolicArrayVariable::currentValue(frontend::TypePointer const& _targetType) const
|
smt::Expression SymbolicArrayVariable::currentValue(frontend::TypePointer const& _targetType) const
|
||||||
{
|
{
|
||||||
if (_targetType)
|
if (_targetType)
|
||||||
|
{
|
||||||
|
solAssert(m_originalType, "");
|
||||||
// StringLiterals are encoded as SMT arrays in the generic case,
|
// StringLiterals are encoded as SMT arrays in the generic case,
|
||||||
// but they can also be compared/assigned to fixed bytes, in which
|
// but they can also be compared/assigned to fixed bytes, in which
|
||||||
// case they'd need to be encoded as numbers.
|
// case they'd need to be encoded as numbers.
|
||||||
if (auto strType = dynamic_cast<StringLiteralType const*>(m_originalType))
|
if (auto strType = dynamic_cast<StringLiteralType const*>(m_originalType))
|
||||||
if (_targetType->category() == frontend::Type::Category::FixedBytes)
|
if (_targetType->category() == frontend::Type::Category::FixedBytes)
|
||||||
return smt::Expression(u256(toHex(util::asBytes(strType->value()), util::HexPrefix::Add)));
|
return smt::Expression(u256(toHex(util::asBytes(strType->value()), util::HexPrefix::Add)));
|
||||||
|
}
|
||||||
|
|
||||||
return SymbolicVariable::currentValue(_targetType);
|
return SymbolicVariable::currentValue(_targetType);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
EncodingContext& _context
|
EncodingContext& _context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SymbolicVariable(SymbolicVariable&&) = default;
|
||||||
|
|
||||||
virtual ~SymbolicVariable() = default;
|
virtual ~SymbolicVariable() = default;
|
||||||
|
|
||||||
virtual Expression currentValue(frontend::TypePointer const& _targetType = TypePointer{}) const;
|
virtual Expression currentValue(frontend::TypePointer const& _targetType = TypePointer{}) const;
|
||||||
@ -212,6 +214,13 @@ public:
|
|||||||
std::string _uniqueName,
|
std::string _uniqueName,
|
||||||
EncodingContext& _context
|
EncodingContext& _context
|
||||||
);
|
);
|
||||||
|
SymbolicArrayVariable(
|
||||||
|
SortPointer _sort,
|
||||||
|
std::string _uniqueName,
|
||||||
|
EncodingContext& _context
|
||||||
|
);
|
||||||
|
|
||||||
|
SymbolicArrayVariable(SymbolicArrayVariable&&) = default;
|
||||||
|
|
||||||
Expression currentValue(frontend::TypePointer const& _targetType = TypePointer{}) const override;
|
Expression currentValue(frontend::TypePointer const& _targetType = TypePointer{}) const override;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user