mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-06 06:33:30 +00:00
Build fuzzer tests in standalone builds too.
This will avoid compilation to break, and adds standalone reproducers for the fuzzer_tests. BUG=chromium:903380 BUG=dawn:34 Change-Id: I9995a852076d9f6d1ebdee5b999989c2d74d4709 Reviewed-on: https://dawn-review.googlesource.com/c/2321 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Dan Sinclair <dsinclair@google.com>
This commit is contained in:
parent
45ee4c88c4
commit
597e1587b4
109
BUILD.gn
109
BUILD.gn
@ -17,9 +17,6 @@ import("scripts/dawn_features.gni")
|
|||||||
import("//build_overrides/build.gni")
|
import("//build_overrides/build.gni")
|
||||||
|
|
||||||
import("//testing/test.gni")
|
import("//testing/test.gni")
|
||||||
if (build_with_chromium) {
|
|
||||||
import("//testing/libfuzzer/fuzzer_test.gni")
|
|
||||||
}
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Template to wrap the Dawn code generator
|
# Template to wrap the Dawn code generator
|
||||||
@ -948,100 +945,16 @@ if (dawn_standalone) {
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
# Fuzzers
|
# Fuzzers
|
||||||
###############################################################################
|
###############################################################################
|
||||||
if (build_with_chromium) {
|
|
||||||
group("dawn_fuzzers") {
|
|
||||||
testonly = true
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_glsl_fast_fuzzer",
|
|
||||||
":dawn_spirv_cross_glsl_full_fuzzer",
|
|
||||||
":dawn_spirv_cross_hlsl_fast_fuzzer",
|
|
||||||
":dawn_spirv_cross_hlsl_full_fuzzer",
|
|
||||||
":dawn_spirv_cross_msl_fast_fuzzer",
|
|
||||||
":dawn_spirv_cross_msl_full_fuzzer",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
static_library("dawn_spirv_cross_fuzzer_common") {
|
group("dawn_fuzzers") {
|
||||||
sources = [
|
testonly = true
|
||||||
"src/fuzzers/DawnSPIRVCrossFuzzer.cpp",
|
deps = [
|
||||||
"src/fuzzers/DawnSPIRVCrossFuzzer.h",
|
"src/fuzzers:dawn_spirv_cross_glsl_fast_fuzzer",
|
||||||
]
|
"src/fuzzers:dawn_spirv_cross_glsl_full_fuzzer",
|
||||||
public_deps = [
|
"src/fuzzers:dawn_spirv_cross_hlsl_fast_fuzzer",
|
||||||
"third_party:spirv_cross",
|
"src/fuzzers:dawn_spirv_cross_hlsl_full_fuzzer",
|
||||||
]
|
"src/fuzzers:dawn_spirv_cross_msl_fast_fuzzer",
|
||||||
}
|
"src/fuzzers:dawn_spirv_cross_msl_full_fuzzer",
|
||||||
|
"src/fuzzers:dawn_wire_server_and_frontend_fuzzer",
|
||||||
# Uses Dawn specific options and varies input data
|
]
|
||||||
fuzzer_test("dawn_spirv_cross_glsl_fast_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Varies bother the options and input data
|
|
||||||
fuzzer_test("dawn_spirv_cross_glsl_full_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Uses Dawn specific options and varies input data
|
|
||||||
fuzzer_test("dawn_spirv_cross_hlsl_fast_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Varies bother the options and input data
|
|
||||||
fuzzer_test("dawn_spirv_cross_hlsl_full_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Uses Dawn specific options and varies input data
|
|
||||||
fuzzer_test("dawn_spirv_cross_msl_fast_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Varies bother the options and input data
|
|
||||||
fuzzer_test("dawn_spirv_cross_msl_full_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
|
||||||
]
|
|
||||||
deps = [
|
|
||||||
":dawn_spirv_cross_fuzzer_common",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
fuzzer_test("dawn_wire_server_and_frontend_fuzzer") {
|
|
||||||
sources = [
|
|
||||||
"src/fuzzers/DawnWireServerAndFrontendFuzzer.cpp",
|
|
||||||
]
|
|
||||||
|
|
||||||
deps = [
|
|
||||||
":libdawn",
|
|
||||||
":libdawn_native",
|
|
||||||
":libdawn_wire",
|
|
||||||
]
|
|
||||||
|
|
||||||
additional_configs = [ ":dawn_shared_library_public" ]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
150
src/fuzzers/BUILD.gn
Normal file
150
src/fuzzers/BUILD.gn
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# Copyright 2018 The Dawn Authors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import("//build_overrides/build.gni")
|
||||||
|
|
||||||
|
dawn_top_level = "../.."
|
||||||
|
|
||||||
|
# We only have libfuzzer in Chromium builds but if we build fuzzer targets only
|
||||||
|
# there, we would risk breaking fuzzer targets all the time when making changes
|
||||||
|
# to Dawn. To avoid that, we make fuzzer targets compile in standalone builds
|
||||||
|
# as well with a dawn_fuzzer_test target that acts like Chromium's fuzzer_test.
|
||||||
|
#
|
||||||
|
# The standalone fuzzer targets are able to run a single fuzzer input which
|
||||||
|
# could help reproduce fuzzer crashes more easily because you don't need a
|
||||||
|
# whole Chromium checkout.
|
||||||
|
|
||||||
|
if (build_with_chromium) {
|
||||||
|
import("//testing/libfuzzer/fuzzer_test.gni")
|
||||||
|
|
||||||
|
# In Chromium build we just proxy everything to the real fuzzer_test
|
||||||
|
template("dawn_fuzzer_test") {
|
||||||
|
fuzzer_test(target_name) {
|
||||||
|
forward_variables_from(invoker, "*")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
import("//testing/test.gni")
|
||||||
|
|
||||||
|
# In standalone build we do something similar to fuzzer_test.
|
||||||
|
template("dawn_fuzzer_test") {
|
||||||
|
test(target_name) {
|
||||||
|
forward_variables_from(invoker,
|
||||||
|
[
|
||||||
|
"cflags",
|
||||||
|
"cflags_cc",
|
||||||
|
"check_includes",
|
||||||
|
"defines",
|
||||||
|
"deps",
|
||||||
|
"include_dirs",
|
||||||
|
"sources",
|
||||||
|
])
|
||||||
|
|
||||||
|
if (!defined(configs)) {
|
||||||
|
configs = []
|
||||||
|
}
|
||||||
|
|
||||||
|
# Weirdly fuzzer_test uses a special variable for additional configs.
|
||||||
|
if (defined(invoker.additional_configs)) {
|
||||||
|
configs += invoker.additional_configs
|
||||||
|
}
|
||||||
|
|
||||||
|
sources += [ "StandaloneFuzzerMain.cpp" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static_library("dawn_spirv_cross_fuzzer_common") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossFuzzer.cpp",
|
||||||
|
"DawnSPIRVCrossFuzzer.h",
|
||||||
|
]
|
||||||
|
public_deps = [
|
||||||
|
"${dawn_top_level}/third_party:spirv_cross",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uses Dawn specific options and varies input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_glsl_fast_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Varies bother the options and input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_glsl_full_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uses Dawn specific options and varies input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_hlsl_fast_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Varies bother the options and input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_hlsl_full_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uses Dawn specific options and varies input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_msl_fast_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFastFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Varies bother the options and input data
|
||||||
|
dawn_fuzzer_test("dawn_spirv_cross_msl_full_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnSPIRVCrossGLSLFullFuzzer.cpp",
|
||||||
|
]
|
||||||
|
deps = [
|
||||||
|
":dawn_spirv_cross_fuzzer_common",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
dawn_fuzzer_test("dawn_wire_server_and_frontend_fuzzer") {
|
||||||
|
sources = [
|
||||||
|
"DawnWireServerAndFrontendFuzzer.cpp",
|
||||||
|
]
|
||||||
|
|
||||||
|
deps = [
|
||||||
|
"${dawn_top_level}:libdawn",
|
||||||
|
"${dawn_top_level}:libdawn_native",
|
||||||
|
"${dawn_top_level}:libdawn_wire",
|
||||||
|
]
|
||||||
|
|
||||||
|
additional_configs = [ "${dawn_top_level}:dawn_shared_library_public" ]
|
||||||
|
}
|
62
src/fuzzers/StandaloneFuzzerMain.cpp
Normal file
62
src/fuzzers/StandaloneFuzzerMain.cpp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// Copyright 2018 The Dawn Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
std::cout << "Usage: <standalone reproducer> [FILE]" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "WARNING: this is just a best-effort reproducer for fuzzer issues in standalone "
|
||||||
|
<< "Dawn builds. For the real fuzzer, please build inside Chromium." << std::endl;
|
||||||
|
|
||||||
|
const char* filename = argv[1];
|
||||||
|
std::cout << "Reproducing using file: " << filename << std::endl;
|
||||||
|
|
||||||
|
std::vector<char> data;
|
||||||
|
{
|
||||||
|
FILE* file = fopen(filename, "rb");
|
||||||
|
if (!file) {
|
||||||
|
std::cerr << "Failed to open " << filename << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
long tellFileSize = ftell(file);
|
||||||
|
if (tellFileSize <= 0) {
|
||||||
|
std::cerr << "Input file of incorrect size: " << filename << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
|
size_t fileSize = static_cast<size_t>(tellFileSize);
|
||||||
|
data.resize(fileSize);
|
||||||
|
|
||||||
|
size_t bytesRead = fread(data.data(), sizeof(char), fileSize, file);
|
||||||
|
fclose(file);
|
||||||
|
if (bytesRead != fileSize) {
|
||||||
|
std::cerr << "Failed to read " << filename << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return LLVMFuzzerTestOneInput(reinterpret_cast<const uint8_t*>(data.data()), data.size());
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user