mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Bool variables should not allow arithmetic comparison
This commit is contained in:
parent
9705678269
commit
0b6eea0c55
@ -1358,7 +1358,7 @@ TypePointer BoolType::binaryOperatorResult(Token::Value _operator, TypePointer c
|
|||||||
{
|
{
|
||||||
if (category() != _other->category())
|
if (category() != _other->category())
|
||||||
return TypePointer();
|
return TypePointer();
|
||||||
if (Token::isCompareOp(_operator) || _operator == Token::And || _operator == Token::Or)
|
if (_operator == Token::Equal || _operator == Token::NotEqual || _operator == Token::And || _operator == Token::Or)
|
||||||
return _other;
|
return _other;
|
||||||
else
|
else
|
||||||
return TypePointer();
|
return TypePointer();
|
||||||
|
@ -485,11 +485,7 @@ void SMTChecker::compareOperation(BinaryOperation const& _op)
|
|||||||
solUnimplementedAssert(SSAVariable::isBool(_op.annotation().commonType->category()), "Operation not yet supported");
|
solUnimplementedAssert(SSAVariable::isBool(_op.annotation().commonType->category()), "Operation not yet supported");
|
||||||
value = make_shared<smt::Expression>(
|
value = make_shared<smt::Expression>(
|
||||||
op == Token::Equal ? (left == right) :
|
op == Token::Equal ? (left == right) :
|
||||||
op == Token::NotEqual ? (left != right) :
|
/*op == Token::NotEqual*/ (left != right)
|
||||||
op == Token::LessThan ? (!left && right) :
|
|
||||||
op == Token::LessThanOrEqual ? (!left || right) :
|
|
||||||
op == Token::GreaterThan ? (left && !right) :
|
|
||||||
/*op == Token::GreaterThanOrEqual*/ (left || !right)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// TODO: check that other values for op are not possible.
|
// TODO: check that other values for op are not possible.
|
||||||
|
@ -388,35 +388,6 @@ BOOST_AUTO_TEST_CASE(bool_simple)
|
|||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
text = R"(
|
|
||||||
contract C {
|
|
||||||
function f(bool x) public pure {
|
|
||||||
bool y;
|
|
||||||
assert(x <= y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
CHECK_WARNING(text, "Assertion violation happens here");
|
|
||||||
text = R"(
|
|
||||||
contract C {
|
|
||||||
function f(bool x) public pure {
|
|
||||||
bool y;
|
|
||||||
assert(x >= y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
|
||||||
text = R"(
|
|
||||||
contract C {
|
|
||||||
function f(bool x) public pure {
|
|
||||||
require(x);
|
|
||||||
bool y;
|
|
||||||
assert(x > y);
|
|
||||||
assert(y < x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(bool_int_mixed)
|
BOOST_AUTO_TEST_CASE(bool_int_mixed)
|
||||||
|
Loading…
Reference in New Issue
Block a user