Avoid output messages size blow-up using huge bignums literals

This commit is contained in:
Federico Bond 2017-12-19 12:45:04 -03:00 committed by Alex Beregszaszi
parent 954903b505
commit a320ffeafd
4 changed files with 23 additions and 4 deletions

View File

@ -12,6 +12,7 @@ Features:
* Type Checker: Issue warning for using ``public`` visibility for interface functions. * Type Checker: Issue warning for using ``public`` visibility for interface functions.
Bugfixes: Bugfixes:
* Error Output: Truncate huge number literals in the middle to avoid output blow-up.
* Parser: Disallow event declarations with no parameter list. * Parser: Disallow event declarations with no parameter list.
* Standard JSON: Populate the ``sourceLocation`` field in the error list. * Standard JSON: Populate the ``sourceLocation`` field in the error list.
* Standard JSON: Properly support contract and library file names containing a colon (such as URLs). * Standard JSON: Properly support contract and library file names containing a colon (such as URLs).

View File

@ -949,11 +949,25 @@ bool RationalNumberType::operator==(Type const& _other) const
return m_value == other.m_value; return m_value == other.m_value;
} }
string RationalNumberType::toString(bool) const string RationalNumberType::bigintToString(dev::bigint const& _num, bool _short)
{
string str = _num.str();
if (_short && str.size() > 32)
{
int omitted = str.size() - 8;
return str.substr(0, 4) + "...(" + to_string(omitted) + " digits omitted)..." + str.substr(str.size() - 4, 4);
}
return str;
}
string RationalNumberType::toString(bool _short) const
{ {
if (!isFractional()) if (!isFractional())
return "int_const " + m_value.numerator().str(); return "int_const " + bigintToString(m_value.numerator(), _short);
return "rational_const " + m_value.numerator().str() + '/' + m_value.denominator().str();
string numerator = bigintToString(m_value.numerator(), _short);
string denominator = bigintToString(m_value.denominator(), _short);
return "rational_const " + numerator + '/' + denominator;
} }
u256 RationalNumberType::literalValue(Literal const*) const u256 RationalNumberType::literalValue(Literal const*) const

View File

@ -437,6 +437,10 @@ private:
/// @returns true if the literal is a valid rational number. /// @returns true if the literal is a valid rational number.
static std::tuple<bool, rational> parseRational(std::string const& _value); static std::tuple<bool, rational> parseRational(std::string const& _value);
/// @returns a truncated readable representation of the bigint keeping only
/// up to 4 leading and 4 trailing digits.
static std::string bigintToString(dev::bigint const& num, bool _short);
}; };
/** /**

View File

@ -1752,7 +1752,7 @@ BOOST_AUTO_TEST_CASE(overflow_caused_by_ether_units)
uint256 a; uint256 a;
} }
)"; )";
CHECK_ERROR(sourceCode, TypeError, "Type int_const 115792089237316195423570985008687907853269984665640564039458000000000000000000 is not implicitly convertible to expected type uint256."); CHECK_ERROR(sourceCode, TypeError, "Type int_const 1157...(70 digits omitted)...0000 is not implicitly convertible to expected type uint256.");
} }
BOOST_AUTO_TEST_CASE(exp_operator_exponent_too_big) BOOST_AUTO_TEST_CASE(exp_operator_exponent_too_big)