Ejemplo n.º 1
0
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