def call(self, analysis_type, from_inst_num, func_args=None): setglobal('call_counter', call_counter + 1) res = {"types": create_empty('types'), 'values': create_empty_value()} prev_state = _state for code in self.cfgs: # if (code, from_inst_num) in call_table: # res |= call_table[(code, from_inst_num)] ## print "FUNCTIONS CACHE HIT: %r %r!" % (code, from_inst_num) # else: call_stack.append((code, from_inst_num)) cfgobj = self._create_cfgobj(code, func_args) self.process_cfg(cfgobj) # print call_stack print "============================================================" print cfgobj.bbs['exit'].states.states['normal'] print "============================================================" #self.store_call_result(cfgobj, *call_stack.pop()) if cfgobj.bbs['exit'].states.states['normal'].stack is not None: temp = cfgobj.bbs['exit'].states.states['normal'].stack.vars[ -1] res["types"] |= temp["types"] res["values"] |= temp["values"] print "TYPE", temp["values"].type_of_analysis if "aliases" in temp.keys(): res["aliases"] = temp["aliases"] else: res["aliases"] = create_empty_alias(None, None) #res["types"] |= cfgobj.bbs['exit'].states.states['normal'].stack.vars[-1]["types"] #got_res = cfgobj.bbs['exit'].states.states['normal'].stack.vars[-1] #res["types"] |= got_res["types"] #if "aliases" in got_res.keys(): # res["aliases"] = got_res["aliases"] #else: # res["aliases"] = create_empty_alias(None,None) print cfgobj.bbs['exit'].states.states['normal'].stack _megastore.add_one(cfgobj) #print cfgobj.prefix, cfgobj.bbs['exit'].states.states['normal'] self._set_state(prev_state) setglobal('call_counter', call_counter - 1) if self.is_generator: # new_res = VarTypes(init_from={TypeGeneratorObject.implemented_types[0]: None}) new_res = { "types": VarTypes(init_consts=[[]]), 'values': create_unknown_value() } new_res["types"].types['TypeSuperList'].append(res) return new_res["types"].get_iter(None, TypeGeneratorObject) else: return res
def process(self, fname): setglobal('lge_counter', 0) setglobal('repr_counter', 0) setglobal('call_counter', 0) setglobal('repr_list', []) setglobal('lge_list', []) # self.__module = cfg_wrapper.MyModule(base_instance = deepcopy(module)) try: RootState except NameError: SymbolTable.create_root_symtable() TypeModule._set_state(RootState) top_module = TypeModule.from_code(fname) self.__module = top_module.module
def call(self, analysis_type, from_inst_num, func_args=None): setglobal("call_counter", call_counter + 1) res = {"types": create_empty("types"), "values": create_empty_value()} prev_state = _state for code in self.cfgs: # if (code, from_inst_num) in call_table: # res |= call_table[(code, from_inst_num)] ## print "FUNCTIONS CACHE HIT: %r %r!" % (code, from_inst_num) # else: call_stack.append((code, from_inst_num)) cfgobj = self._create_cfgobj(code, func_args) self.process_cfg(cfgobj) # print call_stack print "============================================================" print cfgobj.bbs["exit"].states.states["normal"] print "============================================================" # self.store_call_result(cfgobj, *call_stack.pop()) if cfgobj.bbs["exit"].states.states["normal"].stack is not None: temp = cfgobj.bbs["exit"].states.states["normal"].stack.vars[-1] res["types"] |= temp["types"] res["values"] |= temp["values"] print "TYPE", temp["values"].type_of_analysis if "aliases" in temp.keys(): res["aliases"] = temp["aliases"] else: res["aliases"] = create_empty_alias(None, None) # res["types"] |= cfgobj.bbs['exit'].states.states['normal'].stack.vars[-1]["types"] # got_res = cfgobj.bbs['exit'].states.states['normal'].stack.vars[-1] # res["types"] |= got_res["types"] # if "aliases" in got_res.keys(): # res["aliases"] = got_res["aliases"] # else: # res["aliases"] = create_empty_alias(None,None) print cfgobj.bbs["exit"].states.states["normal"].stack _megastore.add_one(cfgobj) # print cfgobj.prefix, cfgobj.bbs['exit'].states.states['normal'] self._set_state(prev_state) setglobal("call_counter", call_counter - 1) if self.is_generator: # new_res = VarTypes(init_from={TypeGeneratorObject.implemented_types[0]: None}) new_res = {"types": VarTypes(init_consts=[[]]), "values": create_unknown_value()} new_res["types"].types["TypeSuperList"].append(res) return new_res["types"].get_iter(None, TypeGeneratorObject) else: return res
def _set_state(state): setglobal('stack', state.stack) setglobal('smtbl', state.smtbl) setglobal('_aso', state._aso) setglobal('_state', state)
insts_handler.add_set( InstSet(['POP_JUMP_IF_TRUE', 'POP_JUMP_IF_FALSE'], pop_jump_if)) insts_handler.add_set( InstSet(['JUMP_IF_TRUE_OR_POP', 'JUMP_IF_FALSE_OR_POP'], jump_if_or_pop)) insts_handler.add_set( InstSet([ 'PRINT_EXPR', 'PRINT_ITEM', 'PRINT_NEWLINE', 'PRINT_ITEM_TO', 'PRINT_NEWLINE_TO' ], print_insts)) insts_handler.add_set( InstSet(['STOP_CODE', 'NOP', 'EXTENDED_ARG'], cfg_error)) setglobal('TypeCallable', TypeCallable) class TypeModule(TypeCallable, TypeBaseObject): implemented_types = ('module', ) insts_handler = deepcopy(TypeCallable.insts_handler) insts_handler.update(TypeBaseObject.insts_handler) implemented_insts = insts_handler.stored_insts # print implemented_insts import ihooks il = ihooks.ModuleLoader() # if getglobal('include_path'): # il.default_path().append(include_path)
import logging import time from optparse import OptionParser # hack: loading VarTypes, create_empty, etc. in __builtin__ import analyzer.pytypes_run.var_types import analyzer.pytypes_run.interpr_state import analyzer.pytypes_run.var_aliases from analyzer.pytypes_run.base_classes import setglobal from analyzer.pytypes_run.emulation import ProcessModule from analyzer.db.manage import * from analyzer.db.tables import * from analyzer import settings setglobal('mydebugDict', {}) mydebugDict['printWarnings'] = True mydebugDict['printNotImplemented'] = False mydebugDict['printInstr'] = True mydebugDict['printInstrStackVars'] = True mydebugDict['printInstrVarsAfterBlock'] = False mydebugDict['printCommentsSpecTypes'] = True mydebugDict['runAll'] = True mydebugDict['runName'] = 'test.f1' mydebugDict['useAnotherSearch'] = False # работает ~ в 3.2 раза быстрее -
def _set_state(state): setglobal("stack", state.stack) setglobal("smtbl", state.smtbl) setglobal("_aso", state._aso) setglobal("_state", state)
if sys.version_info < (2, 7): insts_handler.add_set(InstSet(["JUMP_IF_TRUE"], jump_if_true)) insts_handler.add_set(InstSet(["JUMP_IF_FALSE"], jump_if_false)) else: insts_handler.add_set(InstSet(["POP_JUMP_IF_TRUE", "POP_JUMP_IF_FALSE"], pop_jump_if)) insts_handler.add_set(InstSet(["JUMP_IF_TRUE_OR_POP", "JUMP_IF_FALSE_OR_POP"], jump_if_or_pop)) insts_handler.add_set( InstSet(["PRINT_EXPR", "PRINT_ITEM", "PRINT_NEWLINE", "PRINT_ITEM_TO", "PRINT_NEWLINE_TO"], print_insts) ) insts_handler.add_set(InstSet(["STOP_CODE", "NOP", "EXTENDED_ARG"], cfg_error)) setglobal("TypeCallable", TypeCallable) class TypeModule(TypeCallable, TypeBaseObject): implemented_types = ("module",) insts_handler = deepcopy(TypeCallable.insts_handler) insts_handler.update(TypeBaseObject.insts_handler) implemented_insts = insts_handler.stored_insts # print implemented_insts import ihooks il = ihooks.ModuleLoader() # if getglobal('include_path'): # il.default_path().append(include_path)