blob: 87a5fb6dafc515f175d7bdc31aa1f70e63429feb [file] [log] [blame] [edit]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/dawn/src/tint/lang/wgsl/reader/reader.h"
#include "third_party/fuzztest/src/fuzztest/fuzztest.h"
#include "tint_wgsl_fuzzer_grammar.h"
void CanParseProgramWithoutCrashing(std::string_view wgsl) {
tint::Source::File file("test.wgsl", wgsl);
tint::wgsl::reader::Options parse_options;
parse_options.allowed_features = tint::wgsl::AllowedFeatures::Everything();
auto program = tint::wgsl::reader::Parse(&file, parse_options);
}
void CanConvertWgslToIRWithoutCrashing(std::string_view wgsl) {
tint::Source::File file("test.wgsl", wgsl);
tint::wgsl::reader::Options parse_options;
parse_options.allowed_features = tint::wgsl::AllowedFeatures::Everything();
auto module = tint::wgsl::reader::WgslToIR(&file, parse_options);
}
// In the following fuzzing tests, we're using two different domains:
// 1. InWgslGrammar(), that will generate a syntactically valid WGSL program
// based on the grammar at //testing/libfuzzer/fuzzers/wgsl_fuzzer/wgsl.g4.
// 2. Arbitrary<std::string> seeded with valid WGSL program. It is frequent
// that parsing bugs are triggered with data structure close to - but not
// matching - the expected data structure. Adding this domain will help finding
// such bugs, but will also ensure we're covering every possible fuzzing test
// cases.
FUZZ_TEST(ChromiumTintWgslTest, CanParseProgramWithoutCrashing)
.WithDomains(fuzztest::OneOf(fuzztest::InWgslGrammar(),
fuzztest::Arbitrary<std::string>().WithSeeds(
[]() -> std::vector<std::string> {
auto domain = fuzztest::InWgslGrammar();
return {domain.GetRandomValue(
std::mt19937_64())};
})));
FUZZ_TEST(ChromiumTintWgslTest, CanConvertWgslToIRWithoutCrashing)
.WithDomains(fuzztest::OneOf(fuzztest::InWgslGrammar(),
fuzztest::Arbitrary<std::string>().WithSeeds(
[]() -> std::vector<std::string> {
auto domain = fuzztest::InWgslGrammar();
return {domain.GetRandomValue(
std::mt19937_64())};
})));