def test_true_false_cache(): claripy.backends._quick_backends.append(claripy.backends.z3) a = claripy.BVS("a_WILL_BE_VIOLATED", 32) c = a == a+1 assert claripy.is_false(c) c.args[1].args = (a, claripy.BVV(0, 32)) assert claripy.is_false(c) assert not claripy.is_true(c) assert not claripy.is_false(a == a) claripy.backends._quick_backends[-1:] = [ ]
def test_true_false_cache(): claripy.backends._quick_backends.append(claripy.backends.z3) a = claripy.BVS("a_WILL_BE_VIOLATED", 32) c = a == a + 1 assert claripy.is_false(c) c.args[1].args = (a, claripy.BVV(0, 32)) assert claripy.is_false(c) assert not claripy.is_true(c) assert not claripy.is_false(a == a) claripy.backends._quick_backends[-1:] = []
def _make_ites(self, seq): # search for a == ^a pairs while True: break_hard = False for i in range(len(seq.nodes)): node_0 = seq.nodes[i] if not type(node_0) is CodeNode: continue rcond_0 = node_0.reaching_condition if rcond_0 is None: continue if claripy.is_true(rcond_0) or claripy.is_false(rcond_0): continue for j in range(i + 1, len(seq.nodes)): node_1 = seq.nodes[j] if not type(node_1) is CodeNode: continue if node_0 is node_1: continue rcond_1 = node_1.reaching_condition if rcond_1 is None: continue cond_ = claripy.simplify(claripy.Not(rcond_0) == rcond_1) if claripy.is_true(cond_): # node_0 and node_1 should be structured using an if-then-else self._make_ite(seq, node_0, node_1) break_hard = True break if break_hard: break else: break
def _handle_ITE(self, expr: pyvex.IRExpr.ITE): cond = self._expr(expr.cond) cond_v = cond.one_value() if claripy.is_true(cond_v): return self._expr(expr.iftrue) elif claripy.is_false(cond_v): return self._expr(expr.iffalse) else: iftrue = self._expr(expr.iftrue) iffalse = self._expr(expr.iffalse) data = iftrue.merge(iffalse) return data
def test_extract_concat_simplify(): a = claripy.BVS("a", 32) assert a[31:0] is a assert a[31:8].concat(a[7:0]) is a assert a[31:16].concat(a[15:8], a[7:0]) is a assert a[31:24].concat(a[23:16], a[15:8], a[7:0]) is a a = claripy.BVS("a", 32) b = a + 100 b_concat = b[31:8].concat(b[7:0]) a100 = a + 100 assert claripy.is_false(b_concat == a100) is False assert list(claripy.Solver().eval(b_concat == a100, 2)) == [True] assert b_concat is a100 assert claripy.is_true(b_concat == a100)
def test_extract_concat_simplify(): a = claripy.BVS("a", 32) assert a[31:0] is a assert a[31:8].concat(a[7:0]) is a # pylint:disable=no-member assert a[31:16].concat(a[15:8], a[7:0]) is a # pylint:disable=no-member assert a[31:24].concat(a[23:16], a[15:8], a[7:0]) is a # pylint:disable=no-member a = claripy.BVS("a", 32) b = a + 100 b_concat = b[31:8].concat(b[7:0]) a100 = a + 100 assert claripy.is_false(b_concat == a100) is False assert list(claripy.Solver().eval(b_concat == a100, 2)) == [ True ] assert b_concat is a100 assert claripy.is_true(b_concat == a100)
def _handle_LoadG(self, stmt): guard = self._expr(stmt.guard) guard_v = guard.one_value() if claripy.is_true(guard_v): # FIXME: full conversion support if stmt.cvt.find('Ident') < 0: l.warning('Unsupported conversion %s in LoadG.', stmt.cvt) load_expr = pyvex.expr.Load(stmt.end, stmt.cvt_types[1], stmt.addr) wr_tmp_stmt = pyvex.stmt.WrTmp(stmt.dst, load_expr) self._handle_WrTmp(wr_tmp_stmt) elif claripy.is_false(guard_v): wr_tmp_stmt = pyvex.stmt.WrTmp(stmt.dst, stmt.alt) self._handle_WrTmp(wr_tmp_stmt) else: if stmt.cvt.find('Ident') < 0: l.warning('Unsupported conversion %s in LoadG.', stmt.cvt) load_expr = pyvex.expr.Load(stmt.end, stmt.cvt_types[1], stmt.addr) load_expr_v = self._expr(load_expr) alt_v = self._expr(stmt.alt) data = load_expr_v.merge(alt_v) self._handle_WrTmpData(stmt.dst, data)
def _handle_StoreG(self, stmt: pyvex.IRStmt.StoreG): guard = self._expr(stmt.guard) guard_v = guard.one_value() if claripy.is_true(guard_v): addr = self._expr(stmt.addr) if len(addr.values) == 1: addrs = next(iter(addr.values.values())) size = stmt.data.result_size(self.tyenv) // 8 data = self._expr(stmt.data) self._store_core(addrs, size, data) elif claripy.is_false(guard_v): pass else: # guard.data == {True, False} # get current data addr = self._expr(stmt.addr) if len(addr.values) == 1: addrs = next(iter(addr.values.values())) size = stmt.data.result_size(self.tyenv) // 8 data_old = self._load_core(addrs, size, stmt.endness) data = self._expr(stmt.data) self._store_core(addrs, size, data, data_old=data_old)
def _is_false(self, v): return claripy.is_false(v)