예제 #1
0
    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')
예제 #2
0
    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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
    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')
예제 #6
0
    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')
예제 #7
0
    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')
예제 #8
0
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))
예제 #9
0
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)
예제 #10
0
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')