| 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) |