def __init__(self, fuzzer: str, benchmark: str, trial_num: int, trial_logger: logs.Logger): self.fuzzer = fuzzer self.benchmark = benchmark self.trial_num = trial_num self.logger = trial_logger trial_name = 'trial-' + str(self.trial_num) self.benchmark_fuzzer_trial_dir = os.path.join(self.benchmark, self.fuzzer, trial_name) work_dir = experiment_utils.get_work_dir() measurement_dir = os.path.join(work_dir, 'measurement-folders', self.benchmark_fuzzer_trial_dir) self.corpus_dir = os.path.join(measurement_dir, 'corpus') self.crashes_dir = os.path.join(measurement_dir, 'crashes') self.sancov_dir = os.path.join(measurement_dir, 'sancovs') self.report_dir = os.path.join(measurement_dir, 'reports') self.trial_dir = os.path.join(work_dir, 'experiment-folders', '%s-%s' % (benchmark, fuzzer), trial_name) # Stores the pcs that have been covered. self.covered_pcs_filename = os.path.join(self.report_dir, 'covered-pcs.txt') # Stores the files that have already been measured for a trial. self.measured_files_path = os.path.join(self.report_dir, 'measured-files.txt') # Used by the runner to signal that there won't be a corpus archive for # a cycle because the corpus hasn't changed since the last cycle. self.unchanged_cycles_path = os.path.join(self.trial_dir, 'results', 'unchanged-cycles')
def __init__(self, experiment, fuzzer, benchmark): self.fuzzer = fuzzer self.benchmark = benchmark self.experiment = experiment self.trial_ids = get_trial_ids(experiment, fuzzer, benchmark) coverage_info_dir = get_coverage_info_dir() self.report_dir = os.path.join(coverage_info_dir, 'reports', benchmark, fuzzer) self.data_dir = os.path.join(coverage_info_dir, 'data', benchmark, fuzzer) benchmark_fuzzer_dir = exp_utils.get_benchmark_fuzzer_dir( benchmark, fuzzer) work_dir = exp_utils.get_work_dir() benchmark_fuzzer_measurement_dir = os.path.join( work_dir, 'measurement-folders', benchmark_fuzzer_dir) self.merged_profdata_file = os.path.join( benchmark_fuzzer_measurement_dir, 'merged.profdata') self.merged_summary_json_file = os.path.join( benchmark_fuzzer_measurement_dir, 'merged.json') coverage_binaries_dir = build_utils.get_coverage_binaries_dir() self.source_files_dir = os.path.join(coverage_binaries_dir, benchmark) self.binary_file = get_coverage_binary(benchmark)
def gcs(path_obj: Path) -> str: """Returns a string with WORK_DIR replaced with |bucket|. |path_obj| should be created by path().""" path_str = str(path_obj) work_dir = experiment_utils.get_work_dir() experiment_bucket = experiment_utils.get_cloud_experiment_path() assert path_str.startswith(work_dir) return path_str.replace(work_dir, experiment_bucket)
def filestore(path_obj: Path) -> str: """Returns a string with WORK_DIR replaced with |experiment_filestore_path|. |path_obj| should be created by path().""" path_str = str(path_obj) work_dir = experiment_utils.get_work_dir() experiment_filestore_path = experiment_utils.get_experiment_filestore_path( ) assert path_str.startswith(work_dir) return path_str.replace(work_dir, experiment_filestore_path)
def __init__(self, fuzzer: str, benchmark: str, trial_num: int): self.fuzzer = fuzzer self.benchmark = benchmark self.trial_num = trial_num self.benchmark_fuzzer_trial_dir = exp_utils.get_trial_dir( fuzzer, benchmark, trial_num) self.work_dir = exp_utils.get_work_dir() self.measurement_dir = os.path.join(self.work_dir, 'measurement-folders', self.benchmark_fuzzer_trial_dir) self.report_dir = os.path.join(self.measurement_dir, 'reports') # Store the profdata file for the current trial. self.profdata_file = os.path.join(self.report_dir, 'data.profdata')
def __init__(self, fuzzer: str, benchmark: str, trial_num: int, trial_logger: logs.Logger): self.fuzzer = fuzzer self.benchmark = benchmark self.trial_num = trial_num self.logger = trial_logger trial_name = 'trial-' + str(self.trial_num) self.benchmark_fuzzer_trial_dir = os.path.join(self.benchmark, self.fuzzer, trial_name) work_dir = experiment_utils.get_work_dir() measurement_dir = os.path.join(work_dir, 'measurement-folders', self.benchmark_fuzzer_trial_dir) self.corpus_dir = os.path.join(measurement_dir, 'corpus') # Keep a directory containing all the corpus units we've already seen. # This is an easy to implement way of storing this info such that # the measurer can restart and continue where it left off. # A better solution could involve using a file to store this info # instead. Another problem with it is it assumes the measurer is running # on one machine. self.prev_corpus_dir = os.path.join(measurement_dir, 'prev-corpus') self.crashes_dir = os.path.join(measurement_dir, 'crashes') self.sancov_dir = os.path.join(measurement_dir, 'sancovs') self.report_dir = os.path.join(measurement_dir, 'reports') self.trial_dir = os.path.join(work_dir, 'experiment-folders', '%s-%s' % (benchmark, fuzzer), trial_name) # Stores the pcs that have been covered. self.covered_pcs_filename = os.path.join(self.report_dir, 'covered-pcs.txt') # Used by the runner to signal that there won't be a corpus archive for # a cycle because the corpus hasn't changed since the last cycle. self.unchanged_cycles_path = os.path.join(self.trial_dir, 'results', 'unchanged-cycles')
def __init__(self, fuzzer: str, benchmark: str, trial_num: int, trial_logger: logs.Logger): self.fuzzer = fuzzer self.benchmark = benchmark self.trial_num = trial_num self.logger = trial_logger benchmark_fuzzer_trial_dir = experiment_utils.get_trial_dir( fuzzer, benchmark, trial_num) work_dir = experiment_utils.get_work_dir() measurement_dir = os.path.join(work_dir, 'measurement-folders', benchmark_fuzzer_trial_dir) self.corpus_dir = os.path.join(measurement_dir, 'corpus') self.crashes_dir = os.path.join(measurement_dir, 'crashes') self.coverage_dir = os.path.join(measurement_dir, 'coverage') self.report_dir = os.path.join(measurement_dir, 'reports') self.trial_dir = os.path.join(work_dir, 'experiment-folders', benchmark_fuzzer_trial_dir) # Stores the files that have already been measured for a trial. self.measured_files_path = os.path.join(self.report_dir, 'measured-files.txt') # Used by the runner to signal that there won't be a corpus archive for # a cycle because the corpus hasn't changed since the last cycle. self.unchanged_cycles_path = os.path.join(self.trial_dir, 'results', 'unchanged-cycles') # Store the profraw file containing coverage data for each cycle. self.profraw_file = os.path.join(self.coverage_dir, 'data.profraw') # Store the profdata file for the current trial. self.profdata_file = os.path.join(self.report_dir, 'data.profdata') # Store the coverage information in json form. self.cov_summary_file = os.path.join(self.report_dir, 'cov_summary.json')
def create_work_subdirs(subdirs: List[str]): """Create |subdirs| in work directory.""" for subdir in subdirs: os.mkdir(os.path.join(experiment_utils.get_work_dir(), subdir))
def path(*path_segments) -> Path: """Returns a Path starting with |path_segements| relative to WORK_DIR.""" return Path(experiment_utils.get_work_dir(), *path_segments)
def get_coverage_info_dir(): """Returns the directory to store coverage information including coverage report and json summary file.""" work_dir = exp_utils.get_work_dir() return os.path.join(work_dir, 'coverage')