def get_functions_call_edges(self): nodes = list() edges = list() if not self.analyzer: self.analyzer = WasmModuleAnalyzer(self.module_bytecode) if not self.functions: self.functions = enum_func(self.module_bytecode) # create nodes for name, param_str, return_str in self.analyzer.func_prototypes: nodes.append(format_func_name(name, param_str, return_str)) log.info('nodes: %s', nodes) # create edges tmp_edges = enum_func_call_edges(self.functions, len(self.analyzer.imports_func)) # tmp_edges = [(node_from, node_to), (...), ...] for node_from, node_to in tmp_edges: # node_from name, param, ret = self.analyzer.func_prototypes[node_from] from_final = format_func_name(name, param, ret) # node_to name, param, ret = self.analyzer.func_prototypes[node_to] to_final = format_func_name(name, param, ret) edges.append(Edge(from_final, to_final, EDGE_CALL)) log.info('edges: %s', edges) return (nodes, edges)
def enum_func(module_bytecode): ''' return a list of Function see:: octopus.core.function ''' functions = list() analyzer = WasmModuleAnalyzer(module_bytecode) protos = analyzer.func_prototypes import_len = len(analyzer.imports_func) for idx, code in enumerate(analyzer.codes): # get corresponding function prototype name, param_str, return_str, _ = protos[import_len + idx] name = format_func_name(name, param_str, return_str) instructions = WasmDisassembler().disassemble(code) cur_function = Function(0, instructions[0], name=name) cur_function.instructions = instructions functions.append(cur_function) return functions