def doprint_generic(self, obj, param1 = None): if isinstance(obj, LeakCounter): pass elif isinstance(obj, CallHistory): if obj.ctxt is not None: self.doprint_line(Type.FUNC_ENTRY, obj.ctxt.caller, [obj.ctxt.callee]) if len(obj.dataleaks) > 0: for leak in sorted_keys(obj.dataleaks): leak.doprint(self) if len(obj.cfleaks) > 0: for leak in sorted_keys(obj.cfleaks): leak.doprint(self) for k in sorted_keys(obj.children): obj.children[k].doprint(self, param1) if obj.ctxt is not None: self.doprint_line(Type.FUNC_EXIT) elif isinstance(obj, CFLeak): self.doprint_line(Type.CFLEAK, obj.ip, obj.get_mergepoint()) elif isinstance(obj, DataLeak): self.doprint_line(Type.DLEAK, obj.ip) else: debug(0, "Unknown instance %s", (obj.__class__)) assert(False)
def doprint_generic(self, obj, param1=False): if isinstance(obj, LeakCounter): self.startNode("LeakStats") self.startNode("Differences") self.doprint_summary("cflow", obj.cflow_diff_total) self.doprint_summary("cflow-drop", obj.cflow_diff_total_dropped) self.doprint_summary("cflow-notest", obj.cflow_diff_total_untested) self.doprint_summary("data", obj.data_diff_total) self.doprint_summary("data-drop", obj.data_diff_total_dropped) self.doprint_summary("data-notest", obj.data_diff_total_untested) self.endNode("Differences") self.startNode("Leaks") self.startNode("Generic") self.doprint_summary("cflow", obj.cflow_leaks_generic) self.doprint_summary("data", obj.data_leaks_generic) self.endNode("Generic") combinedset = set(obj.cflow_leaks_specific.keys()).union( set(obj.data_leaks_specific.keys())) if len(combinedset) == 0: self.startNode("Specific") self.doprint_summary("cflow", 0) self.doprint_summary("data", 0) self.endNode("Specific") else: for sp in combinedset: self.startNode("Specific") self.doprint_line("leakage-model: %s" % str(sp)) if sp in obj.cflow_leaks_specific: self.doprint_summary("cflow", obj.cflow_leaks_specific[sp]) else: self.doprint_summary("cflow", 0) if sp in obj.data_leaks_specific: self.doprint_summary("data", obj.data_leaks_specific[sp]) else: self.doprint_summary("data", 0) self.endNode("Specific") self.endNode("Leaks") self.endNode("LeakStats") elif isinstance(obj, CallHistory): if obj.ctxt is not None: self.startNode(CONTEXT) self.doprint("CALL", obj.ctxt.caller, None) self.doprint("TO", obj.ctxt.callee, None) if param1: if len(obj.dataleaks) > 0: self.startNode(DATALEAKS) for leak in sorted_keys(obj.dataleaks): leak.doprint(self) self.endNode(DATALEAKS) if len(obj.cfleaks) > 0: self.startNode(CFLEAKS) for leak in sorted_keys(obj.cfleaks): leak.doprint(self) self.endNode(CFLEAKS) for k in sorted_keys(obj.children): obj.children[k].doprint(self, param1) if obj.ctxt is not None: self.endNode(CONTEXT) elif isinstance(obj, CFLeak): self.startNode(CFLEAK) self.doprint("", obj.ip, obj.entries if param1 else None) self.doprint_generic(obj.status) self.endNode(CFLEAK) elif isinstance(obj, DataLeak): self.startNode(DATALEAK) self.doprint("", obj.ip, obj.entries if param1 else None) self.doprint_generic(obj.status) if param1: keys = sorted_keys(obj.entries) if len(keys) > 0: self.startNode("MIN") self.doprint("", obj.entries[keys[0]].addr, None) self.endNode("MIN") if len(keys) >= 2: self.startNode("MAX") self.doprint("", obj.entries[keys[-1]].addr, None) self.endNode("MAX") self.endNode(DATALEAK) elif isinstance(obj, CFLeakEntry): self.doprint_line(obj.__str__()) elif isinstance(obj, DataLeakEntry): self.doprint_line(obj.__str__()) elif isinstance(obj, LeakStatus): if len(obj.nsleak) > 0 or len(obj.spleak) > 0: self.startNode("result " + str(obj)) for n in sorted(list(obj.nsleak)): self.startEndNode("generic", str(n)) for n in sorted(list(obj.spleak)): self.startEndNode("specific", str(n)) self.endNode("result") else: self.startEndNode("result", str(obj)) elif isinstance(obj, LibHierarchy): self.startNode("LibHierarchy") for k in sorted_keys(obj.entries): obj.entries[k].doprint(self, param1) self.endNode("LibHierarchy") elif isinstance(obj, Library): self.startNode("Lib") self.doprint_line(obj.__str__()) for k in sorted_keys(obj.entries): obj.entries[k].doprint(self, param1) LeakCounter.count(obj).doprint(self) self.endNode("Lib") elif isinstance(obj, FunctionLeak): self.startNode("Function") self.doprint_line(obj.__str__()) if param1: if len(obj.dataleaks) > 0: self.startNode(DATALEAKS) for leak in sorted_keys(obj.dataleaks): leak.doprint(self) self.endNode(DATALEAKS) if len(obj.cfleaks) > 0: self.startNode(CFLEAKS) for leak in sorted_keys(obj.cfleaks): leak.doprint(self) self.endNode(CFLEAKS) self.endNode("Function") else: debug(0, "Unknown instance %s", (obj.__class__)) debug(0, str(isinstance(obj, CallHistory))) debug(0, str(type(obj) is CallHistory)) debug(0, str(id(type(obj)))) debug(0, str(id(CallHistory))) assert (False)
def doprint_generic(self, obj, param1=False): if isinstance(obj, LeakCounter): self.startNode("LeakStats") self.startNode("Differences") self.doprint_summary("cflow", obj.cflow_diff_total) self.doprint_summary("cflow-drop", obj.cflow_diff_total_dropped) self.doprint_summary("cflow-notest", obj.cflow_diff_total_untested) self.doprint_summary("data", obj.data_diff_total) self.doprint_summary("data-drop", obj.data_diff_total_dropped) self.doprint_summary("data-notest", obj.data_diff_total_untested) self.endNode("Differences") self.startNode("Leaks") self.startNode("Generic") self.doprint_summary("cflow", obj.cflow_leaks_generic) self.doprint_summary("data", obj.data_leaks_generic) self.endNode("Generic") combinedset = set(obj.cflow_leaks_specific.keys()).union( set(obj.data_leaks_specific.keys())) if len(combinedset) == 0: self.startNode("Specific") self.doprint_summary("cflow", 0) self.doprint_summary("data", 0) self.endNode("Specific") else: for sp in combinedset: self.startNode("Specific") self.doprint_line("leakage-model: %s" % str(sp)) if sp in obj.cflow_leaks_specific: self.doprint_summary("cflow", obj.cflow_leaks_specific[sp]) else: self.doprint_summary("cflow", 0) if sp in obj.data_leaks_specific: self.doprint_summary("data", obj.data_leaks_specific[sp]) else: self.doprint_summary("data", 0) self.endNode("Specific") self.endNode("Leaks") self.endNode("LeakStats") elif isinstance(obj, CallHistory): if obj.ctxt is not None: self.startNode(CONTEXT) self.doprint("CALL", obj.ctxt.caller, None) self.doprint("TO", obj.ctxt.callee, None) if param1: if len(obj.dataleaks) > 0: self.startNode(DATALEAKS) for leak in sorted_keys(obj.dataleaks): leak.doprint(self) self.endNode(DATALEAKS) if len(obj.cfleaks) > 0: self.startNode(CFLEAKS) for leak in sorted_keys(obj.cfleaks): leak.doprint(self) self.endNode(CFLEAKS) for k in sorted_keys(obj.children): obj.children[k].doprint(self, param1) if obj.ctxt is not None: self.endNode(CONTEXT) elif isinstance(obj, CFLeak) or isinstance(obj, DataLeak): self.startNode(LEAK) self.doprint("", obj.ip, None) if len(obj.entries) > 0: self.startNode("entries") obj.entries.doprint(self) self.endNode("entries") if len(obj.evidence) > 0: self.startNode("evidences") key_indxs = [e.key_index for e in obj.evidence] evidences = [[] for _ in range(max(key_indxs) + 1)] for (idx, key_indx) in enumerate(key_indxs): evidences[key_indx].append(obj.evidence[idx]) for (idx, evidence) in enumerate(evidences): if len(evidence) == 0: continue evidence = deepcopy(evidence) obj_print = MergeMap(EvidenceEntry) obj_print.merge(evidence) node_plain = "phase2" if evidence[ 0].source == 0 else "phase3" if idx == 0: node = f"{node_plain} origin='random'" else: key = evidence[0].key.decode() node = f"{node_plain} origin='fixed' key='{key}'" self.startNode(node) obj_print.doprint(self) self.endNode(node_plain) self.endNode("evidences") self.doprint_generic(obj.status) self.endNode(LEAK) elif isinstance(obj, CFLeakEntry): self.doprint_line(obj.__str__()) elif isinstance(obj, DataLeakEntry): self.doprint_line(obj.__str__()) elif isinstance(obj, EvidenceEntry): self.doprint_line(obj.__str_printer__()) elif isinstance(obj, LeakStatus): if len(obj.nsleak) == 0 and len(obj.spleak) and 0: self.startEndNode("result", str(obj)) return self.startNode(f"result {str(obj)}") # Print NSLeak status_leaks = Counter(sorted(obj.nsleak)) for sl_key in status_leaks.keys(): self.startEndNode( "generic", f"{str(sl_key)} count='{status_leaks[sl_key]}'") # Print SPLeak for n in sorted(list(obj.spleak)): self.startEndNode("specific", str(n)) self.endNode("result") elif isinstance(obj, LibHierarchy): self.startNode("LibHierarchy") for k in sorted_keys(obj.entries): obj.entries[k].doprint(self, param1) self.endNode("LibHierarchy") elif isinstance(obj, Library): self.startNode("Lib") self.doprint_line(obj.__str__()) for k in sorted_keys(obj.entries): obj.entries[k].doprint(self, param1) LeakCounter.count(obj).doprint(self) self.endNode("Lib") elif isinstance(obj, FunctionLeak): self.startNode("Function") self.doprint_line(escape(obj.__str__())) if param1: if len(obj.dataleaks) > 0: self.startNode(DATALEAKS) for leak in sorted_keys(obj.dataleaks): leak.doprint(self) self.endNode(DATALEAKS) if len(obj.cfleaks) > 0: self.startNode(CFLEAKS) for leak in sorted_keys(obj.cfleaks): leak.doprint(self) self.endNode(CFLEAKS) self.endNode("Function") else: debug(0, "Unknown instance %s", (obj.__class__)) debug(0, str(isinstance(obj, CallHistory))) debug(0, str(type(obj) is CallHistory)) debug(0, str(id(type(obj)))) debug(0, str(id(CallHistory))) assert False