コード例 #1
0
ファイル: test_expression.py プロジェクト: iamahuman/claripy
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:] = [ ]
コード例 #2
0
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:] = []
コード例 #3
0
    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
コード例 #4
0
ファイル: engine_vex.py プロジェクト: tutu-001-fighting/angr
    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
コード例 #5
0
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)
コード例 #6
0
ファイル: test_expression.py プロジェクト: iamahuman/claripy
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)
コード例 #7
0
ファイル: engine_vex.py プロジェクト: tutu-001-fighting/angr
    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)
コード例 #8
0
ファイル: engine_vex.py プロジェクト: tutu-001-fighting/angr
    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)
コード例 #9
0
 def _is_false(self, v):
     return claripy.is_false(v)