コード例 #1
0
def test_reverse():

    x = claripy.SI(name="TOP", bits=64, lower_bound=0, upper_bound=0xffffffffffffffff, stride=1)  # TOP
    y = claripy.SI(name="range", bits=64, lower_bound=0, upper_bound=1337, stride=1)  # [0, 1337]

    r0 = x.intersection(y)
    r1 = x.reversed.intersection(y)
    r2 = x.intersection(y.reversed).reversed
    r3 = x.reversed.intersection(y.reversed).reversed

    nose.tools.assert_equal(r0._model_vsa.max, 1337)
    nose.tools.assert_equal(r1._model_vsa.max, 1337)
    nose.tools.assert_equal(r2._model_vsa.max, 1337)
    nose.tools.assert_equal(r3._model_vsa.max, 1337)

    # See claripy issue #95 for details.
    si0 = StridedInterval(name='a', bits=32, stride=0, lower_bound=0xffff0000, upper_bound=0xffff0000)
    si1 = StridedInterval(name='a', bits=32, stride=0, lower_bound=0xffff0001, upper_bound=0xffff0001)
    dsis = DiscreteStridedIntervalSet(name='b', bits=32, si_set={si0, si1})

    dsis_r = dsis.reverse()
    solver = claripy.SolverVSA()
    nose.tools.assert_equal(set(solver.eval(dsis_r, 3)), {0xffff, 0x100ffff})
コード例 #2
0
def test_add():
    # Basic Interval Tests
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.add(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=6)
    # Result should be 1,[3, 13]
    assert check_si_fields(op1.add(op2), 1, 3, 13)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[3, 9]
    assert check_si_fields(op1.add(op2), 1, 3, 9)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[0,9]
    assert check_si_fields(op1.add(op2), 1, 0, 9)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # Result should be 1,[1,7]
    assert check_si_fields(op1.add(op2), 1, 1, 7)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # Result should be 1,[-4, 6]
    assert check_si_fields(op1.add(op2), 1, -4, 6)

    # Strided Tests
    op1 = StridedInterval(bits=4, stride=2, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.add(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=2, upper_bound=6)
    # Result should be 1,[3, 13]
    assert check_si_fields(op1.add(op2), 1, 3, 13)
コード例 #3
0
def test_subtraction():
    # Basic Interval Tests
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.sub(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=6)
    # Result should be 1,[-5, 5]
    # print(str(op1.sub(op2)))
    assert check_si_fields(op1.sub(op2), 1, -5, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[15, 5]
    assert check_si_fields(op1.sub(op2), 1, 15, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[-4, 5]
    assert check_si_fields(op1.sub(op2), 1, -4, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # Result should be 1,[1, 7]
    assert check_si_fields(op1.sub(op2), 1, 1, 7)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # Result should be 1,[2, 12]
    # print(str(op1.sub(op2)))
    assert check_si_fields(op1.sub(op2), 1, 2, 12)

    # Strided Tests
    op1 = StridedInterval(bits=4, stride=2, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.sub(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=2, upper_bound=6)
    # Result should be 1,[11, 5]
    assert check_si_fields(op1.sub(op2), 1, 11, 5)
コード例 #4
0
def test_division():
    # non-overlapping

    # simple case 1
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # <4>0x1[0x0, 0x1]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 1)
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)

    # simple case 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=1)
    # <4>0x1[0xa, 0xc]
    assert check_si_fields(op1.sdiv(op2), 1, 10, 12)
    assert check_si_fields(op1.udiv(op2), 1, 10, 12)

    # simple case 3
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-2)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=-2)
    #udiv:  <4>0x1[0x0, 0x1]
    #sdiv:  <4>0x1[0xc, 0x4]
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)
    assert check_si_fields(op1.sdiv(op2), 1, 12, 4)

    # simple case 4 : Result should be zero
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # BOT
    assert op1.sdiv(op2).is_empty
    assert op1.udiv(op2).is_empty

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=4, upper_bound=6)
    #udiv: <4>0x0[0x0, 0x0]
    #sdiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)
    assert check_si_fields(op1.sdiv(op2), 0, 0, 0)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-3, upper_bound=-1)
    #sdiv: <4>0x1[0x1, 0x6]
    #udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 6)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # one in 0-hemisphere and one in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    #sdiv: <4>0x1[0xc, 0xf]
    #udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 12, 15)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Overlapping

    # case a of figure 2
    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=6)
    #sdiv: <4>0x1[0x0, 0x3]
    #udiv: <4>0x1[0x0, 0x3]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 3)
    assert check_si_fields(op1.udiv(op2), 1, 0, 3)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-7, upper_bound=-1)
    #sdiv: <4>0x1[0x0, 0x6]
    #udiv: <4>0x1[0x0, 0x1]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 6)
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)

    # case b Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=7, upper_bound=5)
    #sdiv: <4>0x1[0x0, 0xf]
    #udiv: <4>0x1[0x0, 0xa]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 15)
    assert check_si_fields(op1.udiv(op2), 1, 0, 10)

    # case c Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=5)
    #sdiv: <4>0x1[0x0, 0xe]
    #udiv: <4>0x1[0x0, 0xa]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 14)
    assert check_si_fields(op1.udiv(op2), 1, 0, 10)

    # Strided Tests

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=4, upper_bound=6)
    # sdiv: <4>0x0[0x0, 0x0]
    # udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 0, 0, 0)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=-3, upper_bound=-1)
    # sdiv: <4>0x1[0x1, 0x6]
    # udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 6)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Overlapping case 1
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=3, lower_bound=7, upper_bound=3)
    # sdiv: <4>0x1[0x9, 0x7]
    # udiv: <4>0x1[0x0, 0x9]
    assert check_si_fields(op1.sdiv(op2), 1, 9, 7)
    assert check_si_fields(op1.udiv(op2), 1, 0, 9)

    # Overlapping case 2
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=1, upper_bound=3)
    # sdiv: <4>0x1[0x1, 0xd]
    # udiv: <4>0x1[0x1, 0x9]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 13)
    assert check_si_fields(op1.udiv(op2), 1, 1, 9)
コード例 #5
0
def test_multiplication():
    # non-overlapping

    # simple case 1
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # <4>0x2[0x2, 0x6]
    assert check_si_fields(op1.mul(op2), 2, 2, 6)

    # simple case 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=1)
    # <4>0x1[0xa, 0xc]
    assert check_si_fields(op1.mul(op2), 1, 10, 12)

    # simple case 3
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-2)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=-2)
    # Stride should be 2.
    # NOTE: previous result was: <4>0x1[0x4, 0x0] which is wrong.
    # possible values of 1[3,e] * 0[e,e] on 4 bits are [a, 8, 6, 4, 2, 0, e, c]
    # in the previous SI 2 was not present.
    assert check_si_fields(op1.mul(op2), 2, 2, 0)

    # simple case 4 : Result should be zero
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.mul(op2), 0, 0, 0)

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=4, upper_bound=6)
    # Result: <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-3, upper_bound=-1)
    # Result <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # one in 0-hemisphere and one in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Overlapping

    # case a of figure 2
    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=6)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-7, upper_bound=-1)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # case b Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=7, upper_bound=5)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # case c Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=5)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Strided Tests

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=4, upper_bound=6)
    # <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=-3, upper_bound=-1)
    # <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # Overlapping case 1
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=3, lower_bound=7, upper_bound=3)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Overlapping case 2
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=1, upper_bound=3)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)
コード例 #6
0
def test_add():
    # Basic Interval Tests
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.add(op2), 1, 0, 15)


    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=6)
    # Result should be 1,[3, 13]
    assert check_si_fields(op1.add(op2), 1, 3, 13)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[3, 9]
    assert check_si_fields(op1.add(op2), 1, 3, 9)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[0,9]
    assert check_si_fields(op1.add(op2), 1, 0, 9)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # Result should be 1,[1,7]
    assert check_si_fields(op1.add(op2), 1, 1, 7)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # Result should be 1,[-4, 6]
    assert check_si_fields(op1.add(op2), 1, -4, 6)

    # Strided Tests
    op1 = StridedInterval(bits=4, stride=2, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.add(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=2, upper_bound=6)
    # Result should be 1,[3, 13]
    assert check_si_fields(op1.add(op2), 1, 3, 13)
コード例 #7
0
def test_subtraction():
    # Basic Interval Tests
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.sub(op2), 1, 0, 15)


    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=6)
    # Result should be 1,[-5, 5]
    # print str(op1.sub(op2))
    assert check_si_fields(op1.sub(op2), 1, -5, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[15, 5]
    assert check_si_fields(op1.sub(op2), 1, 15, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # Result should be 1,[-4, 5]
    assert check_si_fields(op1.sub(op2), 1, -4, 5)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # Result should be 1,[1, 7]
    assert check_si_fields(op1.sub(op2), 1, 1, 7)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # Result should be 1,[2, 12]
    # print str(op1.sub(op2))
    assert check_si_fields(op1.sub(op2), 1, 2, 12)

    # Strided Tests
    op1 = StridedInterval(bits=4, stride=2, lower_bound=-2, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=-6)
    # Result should be TOP
    assert check_si_fields(op1.sub(op2), 1, 0, 15)

    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=2, upper_bound=6)
    # Result should be 1,[11, 5]
    assert check_si_fields(op1.sub(op2), 1, 11, 5)
コード例 #8
0
def test_division():
    # non-overlapping

    # simple case 1
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # <4>0x1[0x0, 0x1]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 1)
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)

    # simple case 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=1)
    # <4>0x1[0xa, 0xc]
    assert check_si_fields(op1.sdiv(op2), 1, 10, 12)
    assert check_si_fields(op1.udiv(op2), 1, 10, 12)

    # simple case 3
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-2)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=-2)
    #udiv:  <4>0x1[0x0, 0x1]
    #sdiv:  <4>0x1[0xc, 0x4]
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)
    assert check_si_fields(op1.sdiv(op2), 1, 12, 4)

    # simple case 4 : Result should be zero
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # BOT
    assert op1.sdiv(op2).is_empty
    assert op1.udiv(op2).is_empty


    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=4, upper_bound=6)
    #udiv: <4>0x0[0x0, 0x0]
    #sdiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)
    assert check_si_fields(op1.sdiv(op2), 0, 0, 0)


    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-3, upper_bound=-1)
    #sdiv: <4>0x1[0x1, 0x6]
    #udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 6)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # one in 0-hemisphere and one in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    #sdiv: <4>0x1[0xc, 0xf]
    #udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 12, 15)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Overlapping

    # case a of figure 2
    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=6)
    #sdiv: <4>0x1[0x0, 0x3]
    #udiv: <4>0x1[0x0, 0x3]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 3)
    assert check_si_fields(op1.udiv(op2), 1, 0, 3)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-7, upper_bound=-1)
    #sdiv: <4>0x1[0x0, 0x6]
    #udiv: <4>0x1[0x0, 0x1]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 6)
    assert check_si_fields(op1.udiv(op2), 1, 0, 1)

    # case b Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=7, upper_bound=5)
    #sdiv: <4>0x1[0x0, 0xf]
    #udiv: <4>0x1[0x0, 0xa]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 15)
    assert check_si_fields(op1.udiv(op2), 1, 0, 10)

    # case c Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=5)
    #sdiv: <4>0x1[0x0, 0xe]
    #udiv: <4>0x1[0x0, 0xa]
    assert check_si_fields(op1.sdiv(op2), 1, 0, 14)
    assert check_si_fields(op1.udiv(op2), 1, 0, 10)

    # Strided Tests

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=4, upper_bound=6)
    # sdiv: <4>0x0[0x0, 0x0]
    # udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 0, 0, 0)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=-3, upper_bound=-1)
    # sdiv: <4>0x1[0x1, 0x6]
    # udiv: <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 6)
    assert check_si_fields(op1.udiv(op2), 0, 0, 0)

    # Overlapping case 1
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=3, lower_bound=7, upper_bound=3)
    # sdiv: <4>0x1[0x9, 0x7]
    # udiv: <4>0x1[0x0, 0x9]
    assert check_si_fields(op1.sdiv(op2), 1, 9, 7)
    assert check_si_fields(op1.udiv(op2), 1, 0, 9)

    # Overlapping case 2
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=1, upper_bound=3)
    # sdiv: <4>0x1[0x1, 0xd]
    # udiv: <4>0x1[0x1, 0x9]
    assert check_si_fields(op1.sdiv(op2), 1, 1, 13)
    assert check_si_fields(op1.udiv(op2), 1, 1, 9)
コード例 #9
0
def test_multiplication():
    # non-overlapping

    # simple case 1
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=2, upper_bound=2)
    # <4>0x2[0x2, 0x6]
    assert check_si_fields(op1.mul(op2), 2, 2, 6)

    # simple case 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=1)
    # <4>0x1[0xa, 0xc]
    assert check_si_fields(op1.mul(op2), 1, 10, 12)

    # simple case 3
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-2)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=-2)
    # Stride should be 2.
    # NOTE: previous result was: <4>0x1[0x4, 0x0] which is wrong.
    # possible values of 1[3,e] * 0[e,e] on 4 bits are [a, 8, 6, 4, 2, 0, e, c]
    # in the previous SI 2 was not present.
    assert check_si_fields(op1.mul(op2), 2, 2, 0)

    # simple case 4 : Result should be zero
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=0)
    # <4>0x0[0x0, 0x0]
    assert check_si_fields(op1.mul(op2), 0, 0, 0)


    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=4, upper_bound=6)
    # Result: <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)


    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-3, upper_bound=-1)
    # Result <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # one in 0-hemisphere and one in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-5, upper_bound=-1)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Overlapping

    # case a of figure 2
    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=6)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-7, upper_bound=-1)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # case b Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=7, upper_bound=5)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # case c Fig 2
    op1 = StridedInterval(bits=4, stride=1, lower_bound=3, upper_bound=-6)
    op2 = StridedInterval(bits=4, stride=1, lower_bound=-2, upper_bound=5)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Strided Tests

    # Both in 0-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=1, upper_bound=3)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=4, upper_bound=6)
    # <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # Both in 1-hemisphere
    op1 = StridedInterval(bits=4, stride=1, lower_bound=-6, upper_bound=-4)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=-3, upper_bound=-1)
    # <4>0x1[0x4, 0x2]
    assert check_si_fields(op1.mul(op2), 1, 4, 2)

    # Overlapping case 1
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=3, lower_bound=7, upper_bound=3)
    # <4>0x1[0x0, 0xf]
    assert check_si_fields(op1.mul(op2), 1, 0, 15)

    # Overlapping case 2
    op1 = StridedInterval(bits=4, stride=2, lower_bound=3, upper_bound=-7)
    op2 = StridedInterval(bits=4, stride=2, lower_bound=1, upper_bound=3)
    # TOP
    assert check_si_fields(op1.mul(op2), 1, 0, 15)
コード例 #10
0
def test_smart_join():
    s1 = StridedInterval(bits=4, stride=3, lower_bound=9, upper_bound=12)
    s2 = StridedInterval(bits=4, stride=3, lower_bound=0, upper_bound=3)
    j = StridedInterval.pseudo_join(s1, s2)
    u = StridedInterval.least_upper_bound(s1, s2)
    assert check_si_fields(u, 3, 0, 12)
    assert check_si_fields(j, 3, 0, 12)

    s1 = StridedInterval(bits=4, stride=0, lower_bound=8, upper_bound=8)
    s2 = StridedInterval(bits=4, stride=1, lower_bound=14, upper_bound=15)
    s3 = StridedInterval(bits=4, stride=1, lower_bound=0, upper_bound=4)
    u = StridedInterval.least_upper_bound(s1, s2, s3)
    assert check_si_fields(u, 1, 14, 8)

    s1 = StridedInterval(bits=4, stride=3, lower_bound=2, upper_bound=8)
    s2 = StridedInterval(bits=4, stride=0, lower_bound=1, upper_bound=1)
    j = StridedInterval.pseudo_join(s1, s2)
    u = StridedInterval.least_upper_bound(s1, s2)
    assert check_si_fields(u, 3, 2, 1)
    assert check_si_fields(j, 3, 2, 1)