| from os import chdir,listdir,environ |
| from os.path import isfile,join,isdir |
| from subprocess import DEVNULL, run |
| import sys |
| |
| ignored_files = "-ignore-filename-regex=glib -ignore-filename-regex=fuzz -ignore-filename-regex=helper -ignore-filename-regex=h$" |
| |
| if __name__ == "__main__": |
| chdir("build/fuzzing/out") |
| available_targets = [exe for exe in listdir("../") if isfile(join("..", exe))] |
| available_corpus_path = [exe for exe in listdir("../../../fuzzing/") if isdir(join("../../../fuzzing/", exe))] |
| available_result_types = ["export", "show", "report"] |
| if len(sys.argv) != 4 or sys.argv[1] not in available_targets or sys.argv[2] not in available_corpus_path or sys.argv[3] not in available_result_types: |
| print("usage : python coverage.py fuzz_target IN_protol result_type") |
| print(" - available targets : ") |
| print(available_targets) |
| print(" - available_corpus_path : ") |
| print(available_corpus_path) |
| print(" - available result types : ") |
| print(available_result_types) |
| exit(0) |
| fuzzing_target = sys.argv[1] |
| corpus_path = "../../../fuzzing/"+sys.argv[2]+"/" |
| result_type = sys.argv[3] |
| if fuzzing_target in available_targets: |
| environ["LLVM_PROFILE_FILE"] = fuzzing_target + "_%p.profraw" |
| corpus = listdir(corpus_path) |
| for f in corpus: |
| #print(corpus_path+f) |
| run(["../" + fuzzing_target, corpus_path+f,"-detect_leaks=0"], stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL) |
| run(["llvm-profdata merge -sparse " + fuzzing_target + "_*.profraw -o " + fuzzing_target + ".profdata"], shell=True) |
| if result_type == "export" : |
| run(["llvm-cov show ../" + fuzzing_target + " -format=html -output-dir=../report -instr-profile=" + fuzzing_target + ".profdata " + ignored_files], shell=True) |
| elif result_type == "show" : |
| run(["llvm-cov show ../" + fuzzing_target + " -instr-profile=" + fuzzing_target + ".profdata " + ignored_files], shell=True) |
| else: |
| run(["llvm-cov report ../" + fuzzing_target + " -instr-profile=" + fuzzing_target + ".profdata " + ignored_files], shell=True) |