diff options
author | Leonardo Alt <leo@ethereum.org> | 2018-04-27 17:35:58 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2018-05-17 00:32:47 +0800 |
commit | 0b6eea0c557d0c987baa2d560fe3871ba3bb4a58 (patch) | |
tree | 78cea0e0f073e47f6b9c2eb81f434e463985f68b | |
parent | 970567826905c953134e54c64f129e31b3fc6a05 (diff) | |
download | dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar.gz dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar.bz2 dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar.lz dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar.xz dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.tar.zst dexon-solidity-0b6eea0c557d0c987baa2d560fe3871ba3bb4a58.zip |
Bool variables should not allow arithmetic comparison
-rw-r--r-- | libsolidity/ast/Types.cpp | 2 | ||||
-rw-r--r-- | libsolidity/formal/SMTChecker.cpp | 6 | ||||
-rw-r--r-- | test/libsolidity/SMTChecker.cpp | 29 |
3 files changed, 2 insertions, 35 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 60e3183c..066868c9 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1358,7 +1358,7 @@ TypePointer BoolType::binaryOperatorResult(Token::Value _operator, TypePointer c { if (category() != _other->category()) 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; else return TypePointer(); diff --git a/libsolidity/formal/SMTChecker.cpp b/libsolidity/formal/SMTChecker.cpp index 425c5c1e..8639317b 100644 --- a/libsolidity/formal/SMTChecker.cpp +++ b/libsolidity/formal/SMTChecker.cpp @@ -485,11 +485,7 @@ void SMTChecker::compareOperation(BinaryOperation const& _op) solUnimplementedAssert(SSAVariable::isBool(_op.annotation().commonType->category()), "Operation not yet supported"); value = make_shared<smt::Expression>( op == Token::Equal ? (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) + /*op == Token::NotEqual*/ (left != right) ); } // TODO: check that other values for op are not possible. diff --git a/test/libsolidity/SMTChecker.cpp b/test/libsolidity/SMTChecker.cpp index 71fdb906..ec23f452 100644 --- a/test/libsolidity/SMTChecker.cpp +++ b/test/libsolidity/SMTChecker.cpp @@ -388,35 +388,6 @@ BOOST_AUTO_TEST_CASE(bool_simple) } )"; 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) |