def test_symbolic_concrete(self): s1 = "hi\0" s2 = self.state.symbolicate_buffer("+++\0") strs = self._push2(s1, s2) ret = strcmp(self.state, *strs) self.assertTrue(Z3Solver.instance().can_be_true( self.state.constraints, ret != 0)) self.assertTrue(Z3Solver.instance().can_be_true( self.state.constraints, ret == 0)) self.state.constrain(s2[0] == ord("a")) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret > 0)) self._clear_constraints() self.state.constrain(s2[0] == ord("z")) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret < 0)) self._clear_constraints() self.state.constrain(s2[0] == ord("h")) self.state.constrain(s2[1] == ord("i")) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret <= 0)) self.state.constrain(s2[2] == ord("\0")) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret == 0))
def test_symbolic_concrete(self): s1 = 'hi\0' s2 = self.state.symbolicate_buffer('+++\0') strs = self._push2(s1, s2) ret = strcmp(self.state, *strs) self.assertTrue(Z3Solver.instance().can_be_true( self.state.constraints, ret != 0)) self.assertTrue(Z3Solver.instance().can_be_true( self.state.constraints, ret == 0)) self.state.constrain(s2[0] == ord('a')) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret > 0)) self._clear_constraints() self.state.constrain(s2[0] == ord('z')) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret < 0)) self._clear_constraints() self.state.constrain(s2[0] == ord('h')) self.state.constrain(s2[1] == ord('i')) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret <= 0)) self.state.constrain(s2[2] == ord('\0')) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret == 0))
def test_symbolic_actually_concrete(self): s1 = "ab\0" s2 = self.state.symbolicate_buffer("d+\0") strs = self._push2(s1, s2) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret < 0))
def test_effective_null(self): s1 = self.state.symbolicate_buffer("a+") s2 = self.state.symbolicate_buffer("++") strs = self._push2(s1, s2) self.state.constrain(s1[1] == 0) self.state.constrain(s2[0] == ord("z")) ret = strcmp(self.state, *strs) self.assertTrue(self.state.must_be_true(ret < 0))
def _concrete_gt(s1, s2): strs = self._push2(s1, s2) ret = strcmp(self.state, *strs) self.assertTrue(ret > 0)
def test_concrete_eq(self): s = "abc\0" strs = self._push2(s, s) ret = strcmp(self.state, *strs) self.assertEqual(ret, 0)