mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Warn on using literals in tight packing
This commit is contained in:
parent
1437521df0
commit
f6dba97fe1
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
Features:
|
Features:
|
||||||
* Optimizer: Add new optimization step to remove unused ``JUMPDEST``s.
|
* Optimizer: Add new optimization step to remove unused ``JUMPDEST``s.
|
||||||
|
* Type Checker: Warn on using literals as tight packing parameters in ``keccak256``, ``sha3``, ``sha256`` and ``ripemd160``.
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
|
||||||
|
@ -1446,6 +1446,28 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
|
|||||||
_functionCall.annotation().type = make_shared<TupleType>(functionType->returnParameterTypes());
|
_functionCall.annotation().type = make_shared<TupleType>(functionType->returnParameterTypes());
|
||||||
|
|
||||||
TypePointers parameterTypes = functionType->parameterTypes();
|
TypePointers parameterTypes = functionType->parameterTypes();
|
||||||
|
|
||||||
|
if (!functionType->padArguments())
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < arguments.size(); ++i)
|
||||||
|
{
|
||||||
|
auto const& argType = type(*arguments[i]);
|
||||||
|
if (auto literal = dynamic_cast<RationalNumberType const*>(argType.get()))
|
||||||
|
{
|
||||||
|
/* If no mobile type is available an error will be raised elsewhere. */
|
||||||
|
if (literal->mobileType())
|
||||||
|
m_errorReporter.warning(
|
||||||
|
_functionCall.location(),
|
||||||
|
"The type of \"" +
|
||||||
|
argType->toString() +
|
||||||
|
"\" was inferred as " +
|
||||||
|
literal->mobileType()->toString() +
|
||||||
|
". This is probably not desired. Use an explicit type to silence this warning."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!functionType->takesArbitraryParameters() && parameterTypes.size() != arguments.size())
|
if (!functionType->takesArbitraryParameters() && parameterTypes.size() != arguments.size())
|
||||||
{
|
{
|
||||||
string msg =
|
string msg =
|
||||||
|
@ -6744,6 +6744,50 @@ BOOST_AUTO_TEST_CASE(reject_interface_constructors)
|
|||||||
CHECK_ERROR(text, TypeError, "Wrong argument count for constructor call: 1 arguments given but expected 0.");
|
CHECK_ERROR(text, TypeError, "Wrong argument count for constructor call: 1 arguments given but expected 0.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(tight_packing_literals)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes32) {
|
||||||
|
return keccak256(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_WARNING(text, "The type of \"int_const 1\" was inferred as uint8.");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes32) {
|
||||||
|
return keccak256(uint8(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes32) {
|
||||||
|
return sha3(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_WARNING(text, "The type of \"int_const 1\" was inferred as uint8.");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes32) {
|
||||||
|
return sha256(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_WARNING(text, "The type of \"int_const 1\" was inferred as uint8.");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes32) {
|
||||||
|
return ripemd160(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_WARNING(text, "The type of \"int_const 1\" was inferred as uint8.");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user