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 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)
Beispiel #7
0
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)