Example #1
0
    def test_1element(self):
        a = ConstDom("")
        o = a.one()
        #self.assertEqual(str(o), 
        #    "{ ONE }")

        a = ConstDom("r1 = 3")
        #test that one is neutral for extend
        b = a.extend(o)
        self.assertEqual(str(b), str(a))
        b = o.extend(a)
        self.assertEqual(str(b), str(a))
Example #2
0
    def test_basic(self):
        a = ConstDom("")
        self.assertEqual(str(a), "{ }")

        a = ConstDom("r1 = 5")
        self.assertEqual(str(a), "{ r1 = 5 ; }")
        b = ConstDom("r2 = 7")
        self.assertEqual(str(b), "{ r2 = 7 ; }")

        c = ConstDom("r1 = 5; r2 = 7")
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; }")

        d = ConstDom("r2 = r2 + 5")
        self.assertEqual(str(d), "{ r2 = r2 + 5 ; }")

        self.assertEqual(wali.getKey('*'), wali.getEpsilonKey())
Example #3
0
    def test_stackmanipulation(self):
        a = ConstDom("r1 = 5 ; r2 = 7")
        push = ConstDom("", "push r1 ; r2")
        f = ConstDom("r1 = 0 ; r2 = 0")
        pop = ConstDom("", "pop r2 ; r1")

        self.assertEqual(str(push), "{ } [push r1 ; r2 ; ]")
        self.assertEqual(str(pop), "{ } [pop r2 ; r1 ; ]")

        incall = a.extend(push)
        self.assertEqual(str(incall), "{ r1 = 5 ; r2 = 7 ; } [push (5) ; (7) ; ]")

        incall2 = a.extend(push).extend(f) 
        self.assertEqual(str(incall2), "{ r1 = 0 ; r2 = 0 ; } [push (5) ; (7) ; ]")

        totalexc = a.extend(push).extend(f).extend(pop)
        self.assertEqual(str(totalexc), "{ r1 = (5) ; r2 = (7) ; }")
Example #4
0
    def test_basicstack(self):
        a = ConstDom("r1 = 5 ; r2 = 7", "top")
        self.assertEqual(str(a), "{ r1 = 5 ; r2 = 7 ; } top")

        a = ConstDom("r1 = 5 ; r2 = 7", "")
        b = ConstDom("r1 = r1 + r2", "")
        push = ConstDom("", "push r1 ; r2")

        self.assertEqual(str(a.extend(b.extend(push))), 
            "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]")
        self.assertEqual(str(a.extend(b).extend(push)), 
            "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]")

        push1 = ConstDom("", "push r1")
        push2 = ConstDom("", "push r2")
        self.assertEqual(str(push1.extend(push2)), "{ } [push r1 ; r2 ; ]")

        pop1 = ConstDom("", "pop r1")
        pop2 = ConstDom("", "pop r2 ; r3")
        self.assertEqual(str(pop1.extend(pop2)), "{ } [pop r1 ; r2 ; r3 ; ]")
Example #5
0
 def getInstructionEffect(ins, func):
     if (ins, func) in instructionEffectCache:
         return instructionEffectCache[(ins, func)]
     else:
         effect = wali.SemElemPtr( 
             ConstDom( 
                 arch.getInstructionEffect(ins, func), 
                 arch.getInstructionStackEffect(ins, func) 
             ) )
         instructionEffectCache[(ins, func)] = effect
         return effect
Example #6
0
    def test_stackmanipulation(self):
        a = ConstDom("r1 = 5 ; r2 = 7")
        push = ConstDom("", "push r1 ; r2")
        f = ConstDom("r1 = 0 ; r2 = 0")
        pop = ConstDom("", "pop r2 ; r1")

        self.assertEqual(str(push), "{ } [push r1 ; r2 ; ]")
        self.assertEqual(str(pop), "{ } [pop r2 ; r1 ; ]")

        incall = a.extend(push)
        self.assertEqual(str(incall),
                         "{ r1 = 5 ; r2 = 7 ; } [push (5) ; (7) ; ]")

        incall2 = a.extend(push).extend(f)
        self.assertEqual(str(incall2),
                         "{ r1 = 0 ; r2 = 0 ; } [push (5) ; (7) ; ]")

        totalexc = a.extend(push).extend(f).extend(pop)
        self.assertEqual(str(totalexc), "{ r1 = (5) ; r2 = (7) ; }")
Example #7
0
    def test_1element(self):
        a = ConstDom("")
        o = a.one()
        #self.assertEqual(str(o),
        #    "{ ONE }")

        a = ConstDom("r1 = 3")
        #test that one is neutral for extend
        b = a.extend(o)
        self.assertEqual(str(b), str(a))
        b = o.extend(a)
        self.assertEqual(str(b), str(a))
Example #8
0
    def test_0element(self):
        a = ConstDom("")
        z = a.zero()
        self.assertEqual(str(z), "{ ZERO }")

        a = ConstDom("r1 = 3")
        #Test that zero is annihilator for extend, i.e.
        # a x Z = Z = Z x a
        b = a.extend(z)
        self.assertEqual(str(b), str(z))
        b = z.extend(a)
        self.assertEqual(str(b), str(z))

        #Test that zero is neutral for combine
        #Test with manual deref
        b = a.combine(z.__deref__())
        self.assertEqual(str(b), str(a))
        #Test with auto deref
        b = a.combine(z)
        self.assertEqual(str(b), str(a))
Example #9
0
    def test_0element(self):
        a = ConstDom("")
        z = a.zero()
        self.assertEqual(str(z), 
            "{ ZERO }")

        a = ConstDom("r1 = 3")
        #Test that zero is annihilator for extend, i.e.
        # a x Z = Z = Z x a
        b = a.extend(z)
        self.assertEqual(str(b), str(z))
        b = z.extend(a)
        self.assertEqual(str(b), str(z))

        #Test that zero is neutral for combine
        #Test with manual deref
        b = a.combine(z.__deref__())
        self.assertEqual(str(b), str(a))
        #Test with auto deref
        b = a.combine(z)
        self.assertEqual(str(b), str(a))
Example #10
0
    def test_extend(self):
        a = ConstDom("r1 = 5")
        b = ConstDom("r2 = 7")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("r2 = r1 + 2")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = (5) + 2 ; }")

        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r3 = r1 + r2")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = (5) + (7) ; }")

        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r3 = r1 + r2")
        c = b.extend(a)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = r1 + r2 ; }")


        a = ConstDom("")
        b = ConstDom("r2 = r1 + 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = r1 + 5 ; }")
        b = ConstDom("r3 = r2 + 5")
        c = c.extend(b)
        self.assertEqual(str(c), "{ r2 = r1 + 5 ; r3 = (r1 + 5) + 5 ; }")
        a = ConstDom("")
        b = ConstDom("r2 = r2 + 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = r2 + 5 ; }")

        #Extend with same value
        a = ConstDom("r2 = 5")
        b = ConstDom("r2 = 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = 5 ; }")

        #extend with unknown value
        a = ConstDom("r2 = 5")
        b = ConstDom("r2 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = top ; }")

        #extend unknown with known value
        a = ConstDom("r2 = top")
        b = ConstDom("r2 = 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = 5 ; }")

        #test syntactic substitution bugs
        a = ConstDom("r1 = 1 ; r12 = 4")
        b = ConstDom("r2 = r1 + r12")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 1 ; r2 = (1) + (4) ; r12 = 4 ; }")

        a = ConstDom("r0 = 1 ; r1 = 2")
        b = ConstDom("r1 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 1 ; r1 = (1) ; }")

        a = ConstDom("r13 = r13 - 4")
        b = ConstDom("r13 = r13 - 4")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 4) - 4 ; }")

        a = ConstDom("r0 = 30 ; r13 = (r13 - 4) - 4 ; r14 = top")
        b = ConstDom("r0 = top ; r13 = (r13 - 4) + 4 ; r14 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r13 = (((r13 - 4) - 4) - 4) + 4 ; r14 = top ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = top")
        b = ConstDom("r0 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = top ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = r13 + 8")
        b = ConstDom("r0 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = r13 + 8 ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = top")
        b = ConstDom("r13 = r13 + 4")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 4) + 4 ; r14 = top ; }")

        a = ConstDom("r1 = 0")
        b = ConstDom("r13 = r13 - 12")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 0 ; r13 = r13 - 12 ; }")

        a = ConstDom("r0 = 67164")
        b = ConstDom("r5 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 67164 ; r5 = (67164) ; }")

        a = ConstDom("r0 = 67164")
        b = ConstDom("r5 = (r0) + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 67164 ; r5 = ((67164)) + 40 ; }")

        a = ConstDom("r13 = r13 - 16")
        b = ConstDom("r13 = r13 + 16")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 16) + 16 ; }")


        a = ConstDom("r1 = top ; r13 = r13 - 16")
        b = ConstDom("r13 = r13 + 16")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = top ; r13 = (r13 - 16) + 16 ; }")

        a = ConstDom("r5 = r0")
        b = ConstDom("r5 = r5 + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r5 = (r0) + 40 ; }")


        #Substitution should only happen in one "level", e.g.
        #r5 + 40 => r0 + 40 =!=> top + 40
        a = ConstDom("r0 = top ; r5 = r0")
        b = ConstDom("r5 = r5 + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r5 = (r0) + 40 ; }")

        a = ConstDom("r0 = 4")
        b = ConstDom("r5 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 4 ; r5 = (4) ; }")
Example #11
0
    def test_combine(self):
        a = ConstDom("r1 = 5")
        b = ConstDom("r1 = 7")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("r1 = 5")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = 5 ; }")
        
        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r1 = 5; r2 = 8")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = top ; }")
        
        a = ConstDom("r1 = 7; r2 = 5")
        b = ConstDom("r1 = 8; r2 = 5")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; r2 = 5 ; }")
        
        a = ConstDom("r1 = 7; r2 = 5")
        b = ConstDom("r1 = 8; r2 = 4")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; r2 = top ; }")
Example #12
0
    def test_extend(self):
        a = ConstDom("r1 = 5")
        b = ConstDom("r2 = 7")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("r2 = r1 + 2")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = (5) + 2 ; }")

        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r3 = r1 + r2")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = (5) + (7) ; }")

        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r3 = r1 + r2")
        c = b.extend(a)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = r1 + r2 ; }")

        a = ConstDom("")
        b = ConstDom("r2 = r1 + 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = r1 + 5 ; }")
        b = ConstDom("r3 = r2 + 5")
        c = c.extend(b)
        self.assertEqual(str(c), "{ r2 = r1 + 5 ; r3 = (r1 + 5) + 5 ; }")
        a = ConstDom("")
        b = ConstDom("r2 = r2 + 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = r2 + 5 ; }")

        #Extend with same value
        a = ConstDom("r2 = 5")
        b = ConstDom("r2 = 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = 5 ; }")

        #extend with unknown value
        a = ConstDom("r2 = 5")
        b = ConstDom("r2 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = top ; }")

        #extend unknown with known value
        a = ConstDom("r2 = top")
        b = ConstDom("r2 = 5")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r2 = 5 ; }")

        #test syntactic substitution bugs
        a = ConstDom("r1 = 1 ; r12 = 4")
        b = ConstDom("r2 = r1 + r12")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 1 ; r2 = (1) + (4) ; r12 = 4 ; }")

        a = ConstDom("r0 = 1 ; r1 = 2")
        b = ConstDom("r1 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 1 ; r1 = (1) ; }")

        a = ConstDom("r13 = r13 - 4")
        b = ConstDom("r13 = r13 - 4")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 4) - 4 ; }")

        a = ConstDom("r0 = 30 ; r13 = (r13 - 4) - 4 ; r14 = top")
        b = ConstDom("r0 = top ; r13 = (r13 - 4) + 4 ; r14 = top")
        c = a.extend(b)
        self.assertEqual(
            str(c),
            "{ r0 = top ; r13 = (((r13 - 4) - 4) - 4) + 4 ; r14 = top ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = top")
        b = ConstDom("r0 = top")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = top ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = r13 + 8")
        b = ConstDom("r0 = top")
        c = a.extend(b)
        self.assertEqual(str(c),
                         "{ r0 = top ; r13 = r13 - 4 ; r14 = r13 + 8 ; }")

        a = ConstDom("r13 = r13 - 4 ; r14 = top")
        b = ConstDom("r13 = r13 + 4")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 4) + 4 ; r14 = top ; }")

        a = ConstDom("r1 = 0")
        b = ConstDom("r13 = r13 - 12")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = 0 ; r13 = r13 - 12 ; }")

        a = ConstDom("r0 = 67164")
        b = ConstDom("r5 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 67164 ; r5 = (67164) ; }")

        a = ConstDom("r0 = 67164")
        b = ConstDom("r5 = (r0) + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 67164 ; r5 = ((67164)) + 40 ; }")

        a = ConstDom("r13 = r13 - 16")
        b = ConstDom("r13 = r13 + 16")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r13 = (r13 - 16) + 16 ; }")

        a = ConstDom("r1 = top ; r13 = r13 - 16")
        b = ConstDom("r13 = r13 + 16")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r1 = top ; r13 = (r13 - 16) + 16 ; }")

        a = ConstDom("r5 = r0")
        b = ConstDom("r5 = r5 + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r5 = (r0) + 40 ; }")

        #Substitution should only happen in one "level", e.g.
        #r5 + 40 => r0 + 40 =!=> top + 40
        a = ConstDom("r0 = top ; r5 = r0")
        b = ConstDom("r5 = r5 + 40")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = top ; r5 = (r0) + 40 ; }")

        a = ConstDom("r0 = 4")
        b = ConstDom("r5 = r0")
        c = a.extend(b)
        self.assertEqual(str(c), "{ r0 = 4 ; r5 = (4) ; }")
Example #13
0
 def test_basicweightdomain(self):
     a = ConstDom("")
     wali.test_semelem_impl(wali.SemElemPtr(a))
Example #14
0
    def test_basicstack(self):
        a = ConstDom("r1 = 5 ; r2 = 7", "top")
        self.assertEqual(str(a), "{ r1 = 5 ; r2 = 7 ; } top")

        a = ConstDom("r1 = 5 ; r2 = 7", "")
        b = ConstDom("r1 = r1 + r2", "")
        push = ConstDom("", "push r1 ; r2")

        self.assertEqual(
            str(a.extend(b.extend(push))),
            "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]")
        self.assertEqual(
            str(a.extend(b).extend(push)),
            "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]")

        push1 = ConstDom("", "push r1")
        push2 = ConstDom("", "push r2")
        self.assertEqual(str(push1.extend(push2)), "{ } [push r1 ; r2 ; ]")

        pop1 = ConstDom("", "pop r1")
        pop2 = ConstDom("", "pop r2 ; r3")
        self.assertEqual(str(pop1.extend(pop2)), "{ } [pop r1 ; r2 ; r3 ; ]")
Example #15
0
    def test_combine(self):
        a = ConstDom("r1 = 5")
        b = ConstDom("r1 = 7")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; }")

        a = ConstDom("r1 = 5")
        b = ConstDom("r1 = 5")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = 5 ; }")

        a = ConstDom("r1 = 5; r2 = 7")
        b = ConstDom("r1 = 5; r2 = 8")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = 5 ; r2 = top ; }")

        a = ConstDom("r1 = 7; r2 = 5")
        b = ConstDom("r1 = 8; r2 = 5")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; r2 = 5 ; }")

        a = ConstDom("r1 = 7; r2 = 5")
        b = ConstDom("r1 = 8; r2 = 4")
        c = a.combine(b)
        self.assertEqual(str(c), "{ r1 = top ; r2 = top ; }")
Example #16
0
def getNoEffect():
    return wali.SemElemPtr( ConstDom("") )