def parse_report(raw_report: str): report = Report() i = 0 raw_checker_report = list() raw_system_info = list() raw_partitioner_stat = list() # General Info for i, line in enumerate(raw_report): if "API" in line: if "DRIVER" in get_last_word(line): report.api_type = APIType.DRIVER elif "SYSCALL" in get_last_word(line): report.api_type = APIType.SYSCALL else: report.api_type = APIType.UNKNOWN elif "System call" in line: assert(report.api_type == APIType.SYSCALL) report.syscall_name = get_last_word(line) elif "Driver" in line: assert(report.api_type == APIType.DRIVER) report.driver_name = get_last_word(line) elif "Num Threads" in line: report.num_threads = get_last_word(line) elif "Analysis Statistic" in line or "System Info" in line: break raw_report = raw_report[i:] if "Use-After-Return Analysis Statistic" in raw_report[0]: for i, line in enumerate(raw_report[1:]): if "Analysis Statistic" not in line and "System Info" not in line: raw_checker_report.append(line) else: checker_report = parse_uar_checker_report(raw_checker_report) report.uar_checker_report = checker_report break del raw_checker_report[:] raw_report = raw_report[i+1:] if "Memory-Leak Analysis Statistic" in raw_report[0]: for i, line in enumerate(raw_report[1:]): if "Analysis Statistic" not in line and "System Info" not in line: raw_checker_report.append(line) else: checker_report = parse_leak_checker_report(raw_checker_report) report.leak_checker_report = checker_report break del raw_checker_report[:] raw_report = raw_report[i+1:] if "Use-After-Free Analysis Statistic" in raw_report[0]: for i, line in enumerate(raw_report[1:]): if "Analysis Statistic" not in line and "System Info" not in line: raw_checker_report.append(line) else: checker_report = parse_uaf_checker_report(raw_checker_report) report.uaf_checker_report = checker_report break del raw_checker_report[:] raw_report = raw_report[i+1:] if "Double-Free Analysis Statistic" in raw_report[0]: for i, line in enumerate(raw_report[1:]): if "Analysis Statistic" not in line and "System Info" not in line: raw_checker_report.append(line) else: checker_report = parse_dfree_checker_report(raw_checker_report) report.dfree_checker_report = checker_report break del raw_checker_report[:] raw_report = raw_report[i+1:] if "Double-Lock Analysis Statistic" in raw_report[0]: for i, line in enumerate(raw_report[1:]): if "Analysis Statistic" not in line and "System Info" not in line: raw_checker_report.append(line) else: checker_report = parse_dlock_checker_report(raw_checker_report) report.dlock_checker_report = checker_report break del raw_checker_report[:] raw_report = raw_report[i+1:] for i, line in enumerate(raw_report): if "Partitioner Statistic" not in line: raw_system_info.append(line) else: report.system_info = parse_system_info(raw_system_info) break raw_report = raw_report[i:] for i, line in enumerate(raw_report): if "Blacklisted" not in line: raw_partitioner_stat.append(line) else: report.partitioner_stat = parse_partitioner_stat(raw_partitioner_stat, report.api_type) break raw_report = raw_report[i:] for i, line in enumerate(raw_report): if "Sinks" not in line: if "," in line: report.blacklist.extend(line.split(",")) else: break raw_report = raw_report[i:] for i, line in enumerate(raw_report): if "Total" not in line: if "," in line: report.delete_functions.extend(line.split(",")) else: report.total_duration = float(get_last_word(line)) break return report