def test_solver_branching(): yield raw_solver_branching, lambda: claripy.FullFrontend(claripy.backends. z3) yield raw_solver_branching, lambda: claripy.HybridFrontend(claripy.backends .z3) yield raw_solver_branching, lambda: claripy.CompositeFrontend( claripy.FullFrontend(claripy.backends.z3))
def test_hybrid_solver(): s = claripy.HybridFrontend(claripy.backends.z3) x = claripy.BVS('x', 32, min=0, max=10, stride=2) y = claripy.BVS('y', 32, min=20, max=30, stride=5) # TODO: for now, the stride isn't respected in symbolic mode, but we'll fix that next. # until we do, let's add constraints s.add(x <= 10) s.add(x % 2 == 0) s.add(y >= 20) s.add(y <= 30) s.add((y - 20) % 5 == 0) nose.tools.assert_equal(s.eval(x, 20, exact=False), (0, 2, 4, 6, 8, 10)) nose.tools.assert_equal(s.eval(x, 20), (0, 2, 4, 6, 8, 10)) nose.tools.assert_equal(s.eval(y, 20, exact=False), (20, 25, 30)) nose.tools.assert_equal(s.eval(y, 20), (20, 25, 30)) # now constrain things further so that the VSA overapproximates s.add(x <= 4) nose.tools.assert_equal(s.eval(x, 20, exact=False), (0, 2, 4, 6, 8, 10)) nose.tools.assert_equal(s.eval(x, 20), (0, 2, 4)) s.add(y >= 27) nose.tools.assert_equal(s.eval(y, 20, exact=False), (20, 25, 30)) nose.tools.assert_equal(s.eval(y, 20), (30, ))
def test_replacement_solver(): sr = claripy.ReplacementFrontend( claripy.HybridFrontend(claripy.backends.z3)) x = claripy.BVS('x', 32) nose.tools.assert_equals(len(sr.eval(x, 10)), 10) sr.result = None sr.add_replacement(x, claripy.BVV(0x101, 32)) nose.tools.assert_items_equal(sr.eval(x, 10), [0x101]) y = claripy.BVS('y', 32) sr.add([y + 1 == 200]) assert (y + 1).cache_key in sr._replacements assert sr._replacement(y + 1) is claripy.BVV(200, 32) srb = sr.branch() assert len(srb.constraints) == len(sr.constraints) assert (y + 1).cache_key in sr._replacements assert sr._replacement(y + 1) is claripy.BVV(200, 32)
def test_ite(): yield raw_ite, lambda: claripy.FullFrontend(claripy.backends.z3) yield raw_ite, lambda: claripy.HybridFrontend(claripy.backends.z3) yield raw_ite, lambda: claripy.CompositeFrontend( claripy.FullFrontend(claripy.backends.z3))
def test_simple_merging(): yield raw_simple_merging, lambda: claripy.FullFrontend(claripy.backends.z3) yield raw_simple_merging, lambda: claripy.HybridFrontend(claripy.backends.z3) yield raw_simple_merging, lambda: claripy.CompositeFrontend(claripy.FullFrontend(claripy.backends.z3))