mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-13 19:01:24 +00:00
This toggle controls if the fuzzer will throw a fatal error in the case that the shader becomes invalid. Currently the fuzzers do no guarantee that the options that are provided are correct/valid, so there are many uninteresting cases that become invalid due to the limited nature of the fuzzers, not due to bugs in the code. The default off state of this toggle will suppress this noise. Once https://bugs.chromium.org/p/tint/issues/detail?id=1356 is implemented this toggle can be default on. BUG=tint:1357,chromium:1294533 Change-Id: I7170e5a30691105c97e20d8337aadf81ac2bc3bc Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/79840 Reviewed-by: Ben Clayton <bclayton@google.com> Auto-Submit: Ryan Harrison <rharrison@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ryan Harrison <rharrison@chromium.org>
117 lines
3.6 KiB
C++
117 lines
3.6 KiB
C++
// Copyright 2021 The Tint 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 "fuzzers/cli.h"
|
|
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <limits>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace tint {
|
|
namespace fuzzers {
|
|
namespace {
|
|
|
|
const char* const kHelpMessage = R"(
|
|
This is a fuzzer for the Tint compiler that works by mutating the AST.
|
|
|
|
Below is a list of all supported parameters for this fuzzer. You may want to
|
|
run it with -help=1 to check out libfuzzer parameters.
|
|
|
|
-tint_dump_input=
|
|
If `true`, the fuzzer will dump input data to a file with
|
|
name tint_input_<hash>.spv/wgsl, where the hash is the hash
|
|
of the input data.
|
|
|
|
-tint_help
|
|
Show this message. Note that there is also a -help=1
|
|
parameter that will display libfuzzer's help message.
|
|
|
|
-tint_enforce_validity=
|
|
If `true`, the fuzzer will enforce that Tint does not
|
|
generate invalid shaders. Currently `false` by default
|
|
since options provided by the fuzzer are not guaranteed
|
|
to be correct.
|
|
See https://bugs.chromium.org/p/tint/issues/detail?id=1356
|
|
)";
|
|
|
|
[[noreturn]] void InvalidParam(const std::string& param) {
|
|
std::cout << "Invalid value for " << param << std::endl;
|
|
std::cout << kHelpMessage << std::endl;
|
|
exit(1);
|
|
}
|
|
|
|
bool ParseBool(const std::string& value, bool* out) {
|
|
if (value.compare("true") == 0) {
|
|
*out = true;
|
|
} else if (value.compare("false") == 0) {
|
|
*out = false;
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
CliParams ParseCliParams(int* argc, char** argv) {
|
|
CliParams cli_params;
|
|
auto help = false;
|
|
|
|
for (int i = *argc - 1; i > 0; --i) {
|
|
std::string param(argv[i]);
|
|
auto recognized_parameter = true;
|
|
|
|
if (std::string::npos != param.find("-tint_dump_input=")) {
|
|
if (!ParseBool(param.substr(std::string("-tint_dump_input=").length()),
|
|
&cli_params.dump_input)) {
|
|
InvalidParam(param);
|
|
}
|
|
} else if (std::string::npos != param.find("-tint_help")) {
|
|
help = true;
|
|
} else if (std::string::npos != param.find("-tint_enforce_validity=")) {
|
|
if (!ParseBool(
|
|
param.substr(std::string("-tint_enforce_validity=").length()),
|
|
&cli_params.enforce_validity)) {
|
|
InvalidParam(param);
|
|
}
|
|
} else {
|
|
recognized_parameter = false;
|
|
}
|
|
|
|
if (recognized_parameter) {
|
|
// Remove the recognized parameter from the list of all parameters by
|
|
// swapping it with the last one. This will suppress warnings in the
|
|
// libFuzzer about unrecognized parameters. By default, libFuzzer thinks
|
|
// that all user-defined parameters start with two dashes. However, we are
|
|
// forced to use a single one to make the fuzzer compatible with the
|
|
// ClusterFuzz.
|
|
std::swap(argv[i], argv[*argc - 1]);
|
|
*argc -= 1;
|
|
}
|
|
}
|
|
|
|
if (help) {
|
|
std::cout << kHelpMessage << std::endl;
|
|
exit(0);
|
|
}
|
|
|
|
return cli_params;
|
|
}
|
|
|
|
} // namespace fuzzers
|
|
} // namespace tint
|