diff --git a/.circleci/config.yml b/.circleci/config.yml index f5ab32ccc..85b0e9d6c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,8 +21,8 @@ parameters: default: "solbuildpackpusher/solidity-buildpack-deps@sha256:7a4d5271b5552139d9f2caefc50d42f401bf74132cf8f253e199e11c80ab42de" ubuntu-1604-clang-ossfuzz-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu1604.clang.ossfuzz-2 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:efaabb3c143f64171be596932c62013bcfd7f73b1fbcb832025a34dd2b6e6922" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu1604.clang.ossfuzz-3 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:6fa6914bd81abcac4b162c738e6ff05d87cefe7655e3859c7a827e5a8ec20dc7" emscripten-docker-image: type: string default: "solbuildpackpusher/solidity-buildpack-deps@sha256:d557d015918c3cf68b0d22839bab41013f0757b651a7fef21595f89721dbebcc" @@ -500,7 +500,6 @@ jobs: CC: clang CXX: clang++ TERM: xterm - CMAKE_OPTIONS: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/libfuzzer.cmake MAKEFLAGS: -j 3 steps: - checkout diff --git a/scripts/ci/build_ossfuzz.sh b/scripts/ci/build_ossfuzz.sh index 42f7b3a39..fc7edf349 100755 --- a/scripts/ci/build_ossfuzz.sh +++ b/scripts/ci/build_ossfuzz.sh @@ -1,15 +1,55 @@ #!/usr/bin/env bash -set -e +set -ex -ROOTDIR="$(dirname "$0")/../.." +ROOTDIR="/root/project" BUILDDIR="${ROOTDIR}/build" +mkdir -p "${BUILDDIR}" && mkdir -p "$BUILDDIR/deps" -mkdir -p "${BUILDDIR}" -cd "${BUILDDIR}" +ANTLRJAR="${ROOTDIR}/build/deps/antlr4.8.jar" +ANTLRJAR_URI="https://www.antlr.org/download/antlr-4.8-complete.jar" -protoc --proto_path=../test/tools/ossfuzz yulProto.proto --cpp_out=../test/tools/ossfuzz -protoc --proto_path=../test/tools/ossfuzz abiV2Proto.proto --cpp_out=../test/tools/ossfuzz -protoc --proto_path=../test/tools/ossfuzz solProto.proto --cpp_out=../test/tools/ossfuzz -cmake .. -DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/libfuzzer.cmake +download_antlr4() +{ + if [[ ! -e "${ANTLRJAR}" ]] + then + wget -O "${ANTLRJAR}" "${ANTLRJAR_URI}" + fi +} -make ossfuzz ossfuzz_proto ossfuzz_abiv2 -j 4 +generate_protobuf_bindings() +{ + cd "${ROOTDIR}"/test/tools/ossfuzz + # Generate protobuf C++ bindings + for protoName in yul abiV2 sol; + do + protoc "${protoName}"Proto.proto --cpp_out . + done +} + +generate_antlr4_bindings() +{ + cd "${ROOTDIR}" + # Replace boolean with bool to suit c++ syntax + sed -i 's/boolean /bool /g' docs/grammar/Solidity.g4 + # Generate antlr4 visitor/parser/lexer c++ bindings + java -jar "${ANTLRJAR}" -Dlanguage=Cpp \ + -Xexact-output-dir -package solidity::test::fuzzer -o test/tools/ossfuzz \ + -no-listener -visitor docs/grammar/SolidityLexer.g4 docs/grammar/Solidity.g4 + # Delete unnecessary autogen files + rm -f "${ROOTDIR}"/test/tools/ossfuzz/Solidity*Visitor.cpp \ + "${ROOTDIR}"/test/tools/ossfuzz/Solidity*.interp \ + "${ROOTDIR}"/test/tools/ossfuzz/Solidity*.tokens +} + +build_fuzzers() +{ + cd "${BUILDDIR}" + cmake .. -DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" \ + -DCMAKE_TOOLCHAIN_FILE="${ROOTDIR}"/cmake/toolchains/libfuzzer.cmake + make ossfuzz ossfuzz_proto ossfuzz_abiv2 -j 4 +} + +download_antlr4 +generate_protobuf_bindings +generate_antlr4_bindings +build_fuzzers \ No newline at end of file diff --git a/test/tools/ossfuzz/CMakeLists.txt b/test/tools/ossfuzz/CMakeLists.txt index a799bd736..372e899a3 100644 --- a/test/tools/ossfuzz/CMakeLists.txt +++ b/test/tools/ossfuzz/CMakeLists.txt @@ -23,12 +23,34 @@ if (OSSFUZZ) endif() if (OSSFUZZ) - add_executable(solc_opt_ossfuzz solc_opt_ossfuzz.cpp ../fuzzer_common.cpp ../../TestCaseReader.cpp) - target_link_libraries(solc_opt_ossfuzz PRIVATE libsolc evmasm) + add_executable(solc_opt_ossfuzz + solc_opt_ossfuzz.cpp + ../fuzzer_common.cpp + ../../TestCaseReader.cpp + SolidityLexer.cpp + SolidityParser.cpp + ) + target_compile_options(solc_opt_ossfuzz + PUBLIC + ${COMPILE_OPTIONS} -Wno-extra-semi -Wno-unused-parameter + ) + target_include_directories(solc_opt_ossfuzz PRIVATE /usr/include/antlr4-runtime) + target_link_libraries(solc_opt_ossfuzz PRIVATE libsolc evmasm antlr4-runtime) set_target_properties(solc_opt_ossfuzz PROPERTIES LINK_FLAGS ${LIB_FUZZING_ENGINE}) - add_executable(solc_noopt_ossfuzz solc_noopt_ossfuzz.cpp ../fuzzer_common.cpp ../../TestCaseReader.cpp) - target_link_libraries(solc_noopt_ossfuzz PRIVATE libsolc evmasm) + add_executable(solc_noopt_ossfuzz + solc_noopt_ossfuzz.cpp + ../fuzzer_common.cpp + ../../TestCaseReader.cpp + SolidityLexer.cpp + SolidityParser.cpp + ) + target_compile_options(solc_noopt_ossfuzz + PUBLIC + ${COMPILE_OPTIONS} -Wno-extra-semi -Wno-unused-parameter + ) + target_include_directories(solc_noopt_ossfuzz PRIVATE /usr/include/antlr4-runtime) + target_link_libraries(solc_noopt_ossfuzz PRIVATE libsolc evmasm antlr4-runtime) set_target_properties(solc_noopt_ossfuzz PROPERTIES LINK_FLAGS ${LIB_FUZZING_ENGINE}) add_executable(const_opt_ossfuzz const_opt_ossfuzz.cpp ../fuzzer_common.cpp)