def test_pySym_AugAssign_SafeBitVec(): # Ensuring that we notice over and underflows ####### # Add # ####### b = ast_parse.parse(test4).body p = Path(b, source=test4) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 0 assert len(pg.deadended) == 1 ####### # Mul # ####### b = ast_parse.parse(test5).body p = Path(b, source=test5) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 0 assert len(pg.deadended) == 1 ####### # Sub # ####### b = ast_parse.parse(test6).body p = Path(b, source=test6) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 0 assert len(pg.deadended) == 1
def test_pySym_AugAssign_Subscript(): b = ast_parse.parse(test9).body p = Path(b, source=test9) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 7.7, 3] b = ast_parse.parse(test10).body p = Path(b, source=test10) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 127, 3] b = ast_parse.parse(test11).body p = Path(b, source=test11) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 4, 3] b = ast_parse.parse(test12).body p = Path(b, source=test12) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 7, 3]
def test_function_String_rstrip_symbolicStrip(): b = ast_parse.parse(test3).body p = Path(b,source=test3) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 5 o = [p.state.any_str('x') for p in pg.completed] o.sort() # 3 cases. 1) both chars miss, 2) one char hit's "t" and the other misses. 3) one hits # "t" and the other hits "s" assert o == ['te', 'te', 'tes', 'tes', 'testt'] b = ast_parse.parse(test4).body p = Path(b,source=test4) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 9 # TODO: This is a brittle match.. o = [p.state.any_str('s') for p in pg.completed] o.sort() assert not o[0].endswith("x") for x in range(1,8): assert o[x].endswith("x"*x)
def test_pyObjectManager_List_varInList(): b = ast_parse.parse(test3).body p = Path(b, source=test3) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2, 3, 4] b = ast_parse.parse(test4).body p = Path(b, source=test4) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2, [3, 4]] # NOTE: This is correct behavior. Python resolves the object when creating the list # Updating the var later has no affect on the list b = ast_parse.parse(test5).body p = Path(b, source=test5) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2, [3, 4]] b = ast_parse.parse(test6).body p = Path(b, source=test6) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2, 4, 4]
def test_function_range(): b = ast_parse.parse(test1).body p = Path(b, source=test1) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('out') == 150 b = ast_parse.parse(test2).body p = Path(b, source=test2) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [4, 5, 6, 7, 8, 9] b = ast_parse.parse(test3).body p = Path(b, source=test3) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
def test_pySym_If_StateSplit(): b = ast_parse.parse(test3).body p = Path(b,source=test3) pg = PathGroup(p) pg.explore() # Splits into 8 possibilities and then if splits again assert len(pg.completed) == 8 assert len(pg.deadended) == 8 # Two of those states should hit the y+=1 assert sum([p.state.any_int('y') for p in pg.completed]) == 2 b = ast_parse.parse(test4).body p = Path(b,source=test4) pg = PathGroup(p) pg.explore() # Splits into 8 possibilities and then if splits again assert len(pg.completed) == 8 assert len(pg.deadended) == 8 # Two of those states should hit the y+=1 assert sum([p.state.any_int('z') for p in pg.completed]) == 1
def test_pySym_ifBoolOp(): b = ast_parse.parse(test1).body p = Path(b,source=test1) pg = PathGroup(p) pg.explore() b = ast_parse.parse(test2).body p = Path(b,source=test2) pg = PathGroup(p) pg.explore()
def test_pySym_nestedWhile(): b = ast_parse.parse(test3).body p = Path(b, source=test3) pg = PathGroup(p) assert pg.explore(find=14) assert pg.found[0].state.any_int('z') == 45 b = ast_parse.parse(test4).body p = Path(b, source=test4) pg = PathGroup(p) assert pg.explore(find=14) assert pg.found[0].state.any_int('z') == 45
def test_pySym_complicated(): b = ast_parse.parse(test5).body p = Path(b, source=test5) pg = PathGroup(p) assert pg.explore(find=19) assert pg.found[0].state.any_int('z') == 26
def test_pyObjectManager_List_BitVec(): b = ast_parse.parse(test8).body p = Path(b, source=test8) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2, 1337, 4] b = ast_parse.parse(test9).body p = Path(b, source=test9) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, [2, 1337], 4]
def test_pyObjectManager_List_setitem(): b = ast_parse.parse(test1).body p = Path(b, source=test1) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 l = pg.completed[0].state.getVar('l') s = pg.completed[0].state # Base check assert l[1].count == 0 assert type(l[1]) == Real # Assign an Int l[1] = Int(varName='x', ctx=0, state=s) assert l[1].count == 1 assert type(l[1]) == Int # Assign back to Real l[1] = Real(varName='x', ctx=0, state=s) assert l[1].count == 2 assert type(l[1]) == Real # Assign to BitVec l[1] = BitVec(varName='x', ctx=0, size=32, state=s) assert l[1].count == 3 assert type(l[1]) == BitVec # Assign List l[1] = List(varName='x', ctx=0, state=s) #assert l[1].count == 4 assert type(l[1]) == List
def test_longer_one(): b = ast_parse.parse(test).body p = Path(b, source=test) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('CRC_POLY') == [ 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1 ] assert pg.completed[0].state.any_list('INNER') == [ 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0 ] assert pg.completed[0].state.any_list('PLAIN_1_BITS') == [ 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0 ]
def test_simpleIf(): b = ast_parse.parse(simpleIf).body p = Path(b, source=simpleIf) # Step through the "if" statement p = p.step()[0] p = p.step()[0] p2 = p.step() ifSide = p2[0] elseSide = p2[1] # ifSide's path should now be inside, meaning only the print statement assert len(ifSide.state.path) == 1 # Else should be in the else statement assert len(elseSide.state.path) == 2 # Neither have anything to do after the if statement assert len(ifSide.state.callStack) == 1 assert len(elseSide.state.callStack) == 0 # If side should not be possible assert not ifSide.state.isSat() assert elseSide.state.isSat() # Track expected number of assertions #assert len(ifSide.state.solver.assertions()) == 3 #assert len(elseSide.state.solver.assertions()) == 3 # Make sure the answer makes sense assert ifSide.state.any_int('x') == None assert elseSide.state.any_int('x') == 1
def test_pyState_AssignListFromSubscript(): b = ast_parse.parse(test4).body p = Path(b, source=test4) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('x') == [4, 5] b = ast_parse.parse(test5).body p = Path(b, source=test5) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('x') == [5, 6, 7]
def test_pySym_functionNestingTwo(): # More intense nesting b = ast_parse.parse(test7).body p = Path(b, source=test7) pg = PathGroup(p) pg.explore() assert pg.completed[0].state.any_int('x') == 7
def test_pyState_nestedSlice(): b = ast_parse.parse(test11).body p = Path(b, source=test11) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('x') == 3
def test_pyState_ListComp_outputModifier(): b = ast_parse.parse(test6).body p = Path(b, source=test6) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [x**2 for x in range(5)]
def test_pyState_Subscript_AssignToVar(): b = ast_parse.parse(test1).body p = Path(b, source=test1) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('x') == 2
def test_pyState_Subscript_MultiDimentional(): b = ast_parse.parse(test3).body p = Path(b, source=test3) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('x') == 4
def test_pyState_ListComp_MoreFunctions(): b = ast_parse.parse(test8).body p = Path(b, source=test8) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [str(i) for i in range(10)]
def test_pyState_ListComp_StringCmp(): b = ast_parse.parse(test7).body p = Path(b, source=test7) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == ["b"]
def test_function_String_rstrip_Char(): b = ast_parse.parse(test5).body p = Path(b,source=test5) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 2 assert set([p.state.any_str('x') for p in pg.completed]) == {"m","mee"}
def test_fnuction_len_statesplit(): b = ast_parse.parse(test2).body p = Path(b, source=test2) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 8 assert set([p.state.any_int('x') for p in pg.completed]) == set(range(8))
def test_pyObjectManager_List_BasicAssign(): b = ast_parse.parse(test1).body p = Path(b, source=test1) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2.2, 3]
def test_pyObjectManager_List_FunctionCalls(): b = ast_parse.parse(test10).body p = Path(b, source=test10) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 12, [24]]
def test_pySym_BinOp_Xor(): b = ast_parse.parse(test4).body p = Path(b,source=test4) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('d') == 13
def test_getZ3Object(): b = ast_parse.parse("x = 12").body p = Path(b, source="x = 12") pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 x = pg.completed[0].state.getVar('x') assert type(x) is Int
def test_pySym_AugAssign_BitStuff(): b = ast_parse.parse(test3).body p = Path(b, source=test3) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('e') == 38776701190144
def test_pyObjectManager_List_NestedList(): b = ast_parse.parse(test2).body p = Path(b, source=test2) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_list('l') == [1, 2.2, [3, [4, 5], 6]]
def test_pySym_BinOp_BitStuff(): b = ast_parse.parse(test5).body p = Path(b,source=test5) pg = PathGroup(p) pg.explore() assert len(pg.completed) == 1 assert pg.completed[0].state.any_int('e') == 57065549561856