From 2d1d944f7e79e113e5c3b93980ff3de51337ba91 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Fri, 23 Sep 2016 20:43:22 +0000 Subject: [PATCH] [libFuzzer] first steps in adding a proper automated test suite based on real-life code: add a script to build RE2 at a revision that has known bugs llvm-svn: 282292 --- .../fuzzer-test-suite/re2-2014-12-09/build.sh | 21 +++++++++++++++++ .../fuzzer-test-suite/re2-2014-12-09/target.cc | 27 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100755 llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/build.sh create mode 100644 llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/target.cc diff --git a/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/build.sh b/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/build.sh new file mode 100755 index 0000000..0b79aa5 --- /dev/null +++ b/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/build.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +[ -e $(basename $0) ] && echo "PLEASE USE THIS SCRIPT FROM ANOTHER DIR" && exit 1 +SCRIPT_DIR=$(dirname $0) +LIBFUZZER_SRC=$(dirname $(dirname $SCRIPT_DIR)) + +FUZZ_CXXFLAGS="-O2 -g -fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp,trace-gep,trace-div" + +get() { + [ ! -e SRC ] && git clone https://github.com/google/re2.git SRC && (cd SRC && git reset --hard 499ef7eff7455ce9c9fae86111d4a77b6ac335de) +} +build_lib() { + rm -rf BUILD + cp -rf SRC BUILD + (cd BUILD && make clean && CXX=clang++ CXXFLAGS="$FUZZ_CXXFLAGS" make -j) +} + +get +build_lib +$LIBFUZZER_SRC/build.sh +clang++ -g $SCRIPT_DIR/target.cc -I BUILD BUILD/obj/libre2.a libFuzzer.a $FUZZ_CXXFLAGS diff --git a/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/target.cc b/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/target.cc new file mode 100644 index 0000000..834db4e --- /dev/null +++ b/llvm/lib/Fuzzer/fuzzer-test-suite/re2-2014-12-09/target.cc @@ -0,0 +1,27 @@ +#include +#include "re2/re2.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < 3) return 0; + uint16_t f = (data[0] << 16) + data[1]; + RE2::Options opt; + opt.set_log_errors(false); + if (f & 1) opt.set_encoding(RE2::Options::EncodingLatin1); + opt.set_posix_syntax(f & 2); + opt.set_longest_match(f & 4); + opt.set_literal(f & 8); + opt.set_never_nl(f & 16); + opt.set_dot_nl(f & 32); + opt.set_never_capture(f & 64); + opt.set_case_sensitive(f & 128); + opt.set_perl_classes(f & 256); + opt.set_word_boundary(f & 512); + opt.set_one_line(f & 1024); + const char *b = reinterpret_cast(data) + 2; + const char *e = reinterpret_cast(data) + size; + std::string s1(b, e); + RE2 re(s1, opt); + if (re.ok()) + RE2::FullMatch(s1, re); + return 0; +} -- 2.7.4