# Copyright 2018 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import json import os import random THIS_DIR = os.path.dirname(os.path.abspath(__file__)) # List of configuration experiments for correctness fuzzing. # List of , <1st config name>, <2nd config name>, <2nd d8>. # Probabilities must add up to 100. with open(os.path.join(THIS_DIR, 'v8_fuzz_experiments.json')) as f: FOOZZIE_EXPERIMENTS = json.load(f) # Additional flag experiments. List of tuples like # (, ). with open(os.path.join(THIS_DIR, 'v8_fuzz_flags.json')) as f: ADDITIONAL_FLAGS = json.load(f) class Config(object): def __init__(self, name, rng=None): """ Args: name: Name of the used fuzzer. rng: Random number generator for generating experiments. random_seed: Random-seed used for d8 throughout one fuzz session. """ self.name = name self.rng = rng or random.Random() def choose_foozzie_flags(self, foozzie_experiments=None, additional_flags=None): """Randomly chooses a configuration from FOOZZIE_EXPERIMENTS. Args: foozzie_experiments: Override experiment config for testing. additional_flags: Override additional flags for testing. Returns: List of flags to pass to v8_foozzie.py fuzz harness. """ foozzie_experiments = foozzie_experiments or FOOZZIE_EXPERIMENTS additional_flags = additional_flags or ADDITIONAL_FLAGS # Add additional flags to second config based on experiment percentages. extra_flags = [] for p, flags in additional_flags: if self.rng.random() < p: for flag in flags.split(): extra_flags.append('--second-config-extra-flags=%s' % flag) # Calculate flags determining the experiment. acc = 0 threshold = self.rng.random() * 100 for prob, first_config, second_config, second_d8 in foozzie_experiments: acc += prob if acc > threshold: return [ '--first-config=' + first_config, '--second-config=' + second_config, '--second-d8=' + second_d8, ] + extra_flags assert False