Bool variables should not allow arithmetic comparison

This commit is contained in:
Leonardo Alt 2018-04-27 11:35:58 +02:00 committed by chriseth
parent 9705678269
commit 0b6eea0c55
3 changed files with 2 additions and 35 deletions

View File

@ -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();

View File

@ -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.

View File

@ -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)