mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Check whether a literal is a valid literal before using it.
Fixes #2078
This commit is contained in:
parent
da818b1acd
commit
3d03e85e4e
15
Types.cpp
15
Types.cpp
@ -210,6 +210,8 @@ TypePointer Type::forLiteral(Literal const& _literal)
|
||||
case Token::FalseLiteral:
|
||||
return make_shared<BoolType>();
|
||||
case Token::Number:
|
||||
if (!IntegerConstantType::isValidLiteral(_literal))
|
||||
return TypePointer();
|
||||
return make_shared<IntegerConstantType>(_literal);
|
||||
case Token::StringLiteral:
|
||||
return make_shared<StringLiteralType>(_literal);
|
||||
@ -321,6 +323,19 @@ const MemberList IntegerType::AddressMemberList({
|
||||
{"send", make_shared<FunctionType>(strings{"uint"}, strings{"bool"}, FunctionType::Location::Send)}
|
||||
});
|
||||
|
||||
bool IntegerConstantType::isValidLiteral(const Literal& _literal)
|
||||
{
|
||||
try
|
||||
{
|
||||
bigint x(_literal.getValue());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
IntegerConstantType::IntegerConstantType(Literal const& _literal)
|
||||
{
|
||||
m_value = bigint(_literal.getValue());
|
||||
|
3
Types.h
3
Types.h
@ -286,6 +286,9 @@ class IntegerConstantType: public Type
|
||||
public:
|
||||
virtual Category getCategory() const override { return Category::IntegerConstant; }
|
||||
|
||||
/// @returns true if the literal is a valid integer.
|
||||
static bool isValidLiteral(Literal const& _literal);
|
||||
|
||||
explicit IntegerConstantType(Literal const& _literal);
|
||||
explicit IntegerConstantType(bigint _value): m_value(_value) {}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user