From fae0e0b9aa9f2c248a2f0236543c1e2ff2978608 Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Sun, 16 Feb 2020 09:47:50 -0800 Subject: [PATCH] Merge #18159: tests: Add --valgrind option to test/fuzz/test_runner.py for running fuzzing test cases under valgrind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1b068c50dd1522990cc33e1aca444741c7e5a747 tests: Add --valgrind option to test/fuzz/test_runner.py for running fuzzing test cases under valgrind (practicalswift) Pull request description: Add `--valgrind` option to `test/fuzz/test_runner.py` for running fuzzing test cases under `valgrind`. Test this PR using: ``` $ make distclean $ ./autogen.sh $ CC=clang CXX=clang++ ./configure --enable-fuzz --with-sanitizers=fuzzer $ make $ git clone https://github.com/bitcoin-core/qa-assets $ test/fuzz/test_runner.py --valgrind -l DEBUG qa-assets/fuzz_seed_corpus/ ``` ACKs for top commit: MarcoFalke: ACK 1b068c50dd1522990cc33e1aca444741c7e5a747 🌒 Tree-SHA512: e6eb99af1bceaa6f36f49092a05de415848099ccc1497cc098a62e925954c978cb37a46410b44ed5eef2c6464ca4ecb06397b75b5d35701f5a8525436e47b9fd --- test/fuzz/test_runner.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/fuzz/test_runner.py b/test/fuzz/test_runner.py index 9271ba72ce..f184bcf19e 100755 --- a/test/fuzz/test_runner.py +++ b/test/fuzz/test_runner.py @@ -50,6 +50,11 @@ def main(): action='store_true', help='If true, export coverage information to files in the seed corpus', ) + parser.add_argument( + '--valgrind', + action='store_true', + help='If true, run fuzzing binaries under the valgrind memory error detector. Valgrind 3.14 or later required.', + ) parser.add_argument( 'seed_dir', help='The seed corpus to run on (must contain subfolders for each fuzz target).', @@ -118,10 +123,11 @@ def main(): test_list=test_list_selection, build_dir=config["environment"]["BUILDDIR"], export_coverage=args.export_coverage, + use_valgrind=args.valgrind, ) -def run_once(*, corpus, test_list, build_dir, export_coverage): +def run_once(*, corpus, test_list, build_dir, export_coverage, use_valgrind): for t in test_list: corpus_path = os.path.join(corpus, t) if t in FUZZERS_MISSING_CORPORA: @@ -132,6 +138,8 @@ def run_once(*, corpus, test_list, build_dir, export_coverage): '-detect_leaks=0', corpus_path, ] + if use_valgrind: + args = ['valgrind', '--quiet', '--error-exitcode=1', '--exit-on-first-error=yes'] + args logging.debug('Run {} with args {}'.format(t, args)) result = subprocess.run(args, stderr=subprocess.PIPE, universal_newlines=True) output = result.stderr