class EthDetectorsTest(unittest.TestCase): def setUp(self): self.io = IntegerOverflow() self.state = make_mock_evm_state() def test_mul_no_overflow(self): """ Regression test added for issue 714, where we were using the ADD ovf check for MUL """ arguments = [1 << (8 * 31), self.state.new_symbolic_value(256)] self.state.constrain(operators.ULT(arguments[1], 256)) # TODO(mark) We should actually call into the EVM cpu here, and below, rather than # effectively copy pasting what the MUL does result = arguments[0] * arguments[1] check = self.io._can_mul_overflow(self.state, result, *arguments) self.assertFalse(check) def test_mul_overflow0(self): arguments = [2 << (8 * 31), self.state.new_symbolic_value(256)] self.state.constrain(operators.ULT(arguments[1], 256)) result = arguments[0] * arguments[1] check = self.io._can_mul_overflow(self.state, result, *arguments) self.assertTrue(check) def test_mul_overflow1(self): arguments = [1 << 255, self.state.new_symbolic_value(256)] result = arguments[0] * arguments[1] check = self.io._can_mul_overflow(self.state, result, *arguments) self.assertTrue(check)
def test_int_ovf(self): mevm = ManticoreEVM() mevm.register_detector(IntegerOverflow()) filename = os.path.join(THIS_DIR, 'binaries/int_overflow.sol') mevm.multi_tx_analysis(filename) self.assertEqual(len(mevm.global_findings), 3) all_findings = ''.join(map(lambda x: x[2], mevm.global_findings)) self.assertIn('underflow at SUB', all_findings) self.assertIn('overflow at ADD', all_findings) self.assertIn('overflow at MUL', all_findings)
def setUp(self): self.io = IntegerOverflow() self.state = self.make_mock_evm_state()