Lines Matching +full:valgrind +full:- +full:fuzz +full:- +full:test
8 # http://www.apache.org/licenses/LICENSE-2.0
17 """Helper script for OSS-Fuzz users. Can do common tasks like building
38 BASE_RUNNER_IMAGE = 'gcr.io/oss-fuzz-base/base-runner'
42 'gcr.io/oss-fuzz-base/base-image',
43 'gcr.io/oss-fuzz-base/base-clang',
44 'gcr.io/oss-fuzz-base/base-builder',
46 'gcr.io/oss-fuzz-base/base-runner-debug',
48 'go': ['gcr.io/oss-fuzz-base/base-builder-go'],
49 'jvm': ['gcr.io/oss-fuzz-base/base-builder-jvm'],
50 'python': ['gcr.io/oss-fuzz-base/base-builder-python'],
51 'rust': ['gcr.io/oss-fuzz-base/base-builder-rust'],
52 'swift': ['gcr.io/oss-fuzz-base/base-builder-swift'],
55 VALID_PROJECT_NAME_REGEX = re.compile(r'^[a-zA-Z0-9_-]+$')
59 'gs://{project_name}-corpus.clusterfuzz-external.appspot.com/libFuzzer/'
62 'gs://{project_name}-backup.clusterfuzz-external.appspot.com/corpus/'
73 raw_input = input # pylint: disable=invalid-name
75 # pylint: disable=too-many-lines
79 """Class representing a project that is in OSS-Fuzz or an external project
137 def main(): # pylint: disable=too-many-branches,too-many-return-statements
212 '--external',
219 def get_parser(): # pylint: disable=too-many-statements
221 parser = argparse.ArgumentParser('helper.py', description='oss-fuzz helpers')
228 '--language',
237 build_image_parser.add_argument('--pull',
240 build_image_parser.add_argument('--cache',
244 build_image_parser.add_argument('--no-pull',
260 build_fuzzers_parser.add_argument('--mount_path',
264 build_fuzzers_parser.add_argument('--clean',
268 build_fuzzers_parser.add_argument('--no-clean',
295 '--corpus-dir', help='directory to store corpus for the fuzz target')
305 coverage_parser.add_argument('--no-corpus-download',
308 'OSS-Fuzz; use corpus located in '
310 coverage_parser.add_argument('--port',
314 coverage_parser.add_argument('--fuzz-target',
315 help='specify name of a fuzz '
318 coverage_parser.add_argument('--corpus-dir',
320 ' to be used (requires --fuzz-target argument)')
325 'pass to llvm-cov utility.',
331 download_corpora_parser.add_argument('--fuzz-target',
332 help='specify name of a fuzz target')
338 reproduce_parser.add_argument('--valgrind',
340 help='run with valgrind')
370 return os.path.exists(os.path.join('infra', 'base-images', image_name))
389 command = ['docker', 'run', '--rm']
390 command.extend(['-v', '%s:/out' % project.out])
393 command.extend(['/bin/bash', '-c', 'test -f /out/%s' % fuzzer_name])
435 parser.add_argument('--architecture',
444 parser.add_argument('--engine',
454 '--sanitizer',
462 parser.add_argument('-e',
472 image_project = 'oss-fuzz-base'
473 docker_build_dir = os.path.join(OSS_FUZZ_DIR, 'infra', 'base-images',
481 image_project = 'oss-fuzz'
488 build_args.append('--no-cache')
491 '-t',
492 'gcr.io/%s/%s' % (image_project, image_name), '--file', dockerfile_path
500 return sum([['-e', v] for v in env_list], [])
529 command = ['docker', 'run', '--rm', '--privileged']
533 command.append('-i')
582 logging.error('Incompatible arguments --pull and --no-pull.')
605 def build_fuzzers_impl( # pylint: disable=too-many-arguments,too-many-locals,too-many-branches
623 '-v',
624 '%s:/out' % project.out, '-t',
625 'gcr.io/oss-fuzz/%s' % project.name, '/bin/bash', '-c', 'rm -rf /out/*'
629 '-v',
630 '%s:/work' % project.work, '-t',
631 'gcr.io/oss-fuzz/%s' % project.name, '/bin/bash', '-c', 'rm -rf /work/*'
635 logging.info('Keeping existing build artifacts as-is (if any).')
650 command = ['--cap-add', 'SYS_PTRACE'] + _env_to_docker_args(env)
655 '-v',
664 '-v',
669 '-v',
670 '%s:/out' % project.out, '-v',
671 '%s:/work' % project.work, '-t',
672 'gcr.io/oss-fuzz/%s' % project.name
728 '-v', '%s:/out' % args.project.out, '-t', BASE_RUNNER_IMAGE
746 """Returns names of fuzz targest build in the project's /out directory."""
749 if name.startswith('afl-'):
753 if name == 'llvm-symbolizer':
757 # Python and JVM fuzz targets are only executable for the root user, so
766 """Downloads the latest corpus for the given fuzz target."""
779 # asking for two-factor authentication.
783 # Some fuzz targets (e.g. new ones) may not have corpus yet, just skip those.
789 latest_backup_url = output.splitlines()[-1]
791 command = ['gsutil', '-q', 'cp', latest_backup_url, archive_path]
794 command = ['unzip', '-q', '-o', archive_path, '-d', corpus_dir]
801 command = ['gsutil', '-m', '-q', 'rsync', '-R', corpus_url, corpus_dir]
812 subprocess.check_call(['gsutil', '--version'], stdout=stdout)
829 except Exception as error: # pylint:disable=broad-except
844 '--corpus-dir requires specifying a particular fuzz target using '
845 '--fuzz-target')
875 '-p',
881 logging.error('The path provided in --corpus-dir argument does not '
885 run_args.extend(['-v', '%s:/corpus/%s' % (corpus_dir, args.fuzz_target)])
887 run_args.extend(['-v', '%s:/corpus' % args.project.corpus])
890 '-v',
892 '-t',
930 logging.error('The path provided in --corpus-dir argument does not exist')
934 '-v',
940 '-v',
942 '-t',
952 """Reproduces a specific test case from a specific project."""
953 return reproduce_impl(args.project, args.fuzzer_name, args.valgrind, args.e,
957 def reproduce_impl( # pylint: disable=too-many-arguments
960 valgrind, argument
975 image_name = 'base-runner'
977 if valgrind:
978 debugger = 'valgrind --tool=memcheck --track-origins=yes --leak-check=full'
981 image_name = 'base-runner-debug'
988 '-v',
990 '-v',
992 '-t',
993 'gcr.io/oss-fuzz-base/%s' % image_name,
996 '-runs=100',
1003 """Validates |project_name| is a valid OSS-Fuzz project name."""
1027 Suitable for OSS-Fuzz and external projects."""
1063 return 'base-builder'
1064 return 'base-builder-{language}'.format(language=language)
1109 if args.project.name != 'base-runner-debug':
1116 image_project = 'oss-fuzz-base'
1119 image_project = 'oss-fuzz'
1125 '-v',
1130 '-v',
1131 '%s:/out' % out_dir, '-v',
1132 '%s:/work' % args.project.work, '-t',