From 19f2215202d03f9cbd1d73f06f82f5c73c42704e Mon Sep 17 00:00:00 2001 From: FuzzTest Team Date: Fri, 22 May 2026 02:35:21 -0700 Subject: [PATCH] Fix flatbuffers enum domain corpus validation PiperOrigin-RevId: 919552381 --- domain_tests/BUILD | 1 - domain_tests/CMakeLists.txt | 1 - .../arbitrary_domains_flatbuffers_test.cc | 23 ++++++------------- .../domains/flatbuffers_domain_impl.h | 21 +++++------------ 4 files changed, 13 insertions(+), 33 deletions(-) diff --git a/domain_tests/BUILD b/domain_tests/BUILD index 100fc8068..0dfd652b4 100644 --- a/domain_tests/BUILD +++ b/domain_tests/BUILD @@ -50,7 +50,6 @@ cc_test( "@abseil-cpp//absl/status", "@com_google_fuzztest//fuzztest:domain", "@com_google_fuzztest//fuzztest:flatbuffers", - "@com_google_fuzztest//fuzztest:fuzztest_macros", "@com_google_fuzztest//fuzztest/internal:meta", "@com_google_fuzztest//fuzztest/internal:test_flatbuffers_cc_fbs", "@flatbuffers//:runtime_cc", diff --git a/domain_tests/CMakeLists.txt b/domain_tests/CMakeLists.txt index ecf92b709..be59c4763 100644 --- a/domain_tests/CMakeLists.txt +++ b/domain_tests/CMakeLists.txt @@ -33,7 +33,6 @@ if (FUZZTEST_BUILD_FLATBUFFERS) fuzztest::domain fuzztest::domain_testing fuzztest::flatbuffers - fuzztest::fuzztest_macros GTest::gmock_main fuzztest_test_flatbuffers_headers ) diff --git a/domain_tests/arbitrary_domains_flatbuffers_test.cc b/domain_tests/arbitrary_domains_flatbuffers_test.cc index 3d397a26b..508ad2698 100644 --- a/domain_tests/arbitrary_domains_flatbuffers_test.cc +++ b/domain_tests/arbitrary_domains_flatbuffers_test.cc @@ -213,26 +213,17 @@ TEST(FlatbuffersEnumDomainImplTest, InvalidEnumValuesAreRejected) { internal::FlatbuffersEnumDomainImpl(enum_def).WithExcludedValues( {internal::ByteEnum_First}); { - auto invalid_value = - static_cast::corpus_type>( - internal::ByteEnum_MIN - 1); - - EXPECT_THAT(domain.ValidateCorpusValue(invalid_value), - StatusIs(absl::StatusCode::kInvalidArgument)); + auto invalid_corpus_value = domain.FromValue(internal::ByteEnum_First); + EXPECT_FALSE(invalid_corpus_value.has_value()); } { - auto invalid_value = - static_cast::corpus_type>( - internal::ByteEnum_MAX + 1); - - EXPECT_THAT(domain.ValidateCorpusValue(invalid_value), - StatusIs(absl::StatusCode::kInvalidArgument)); + auto invalid_corpus_value = domain.FromValue(internal::ByteEnum_MAX + 1); + EXPECT_FALSE(invalid_corpus_value.has_value()); } { - auto invalid_value = - static_cast::corpus_type>( - internal::ByteEnum_First); - EXPECT_THAT(domain.ValidateCorpusValue(invalid_value), + EXPECT_THAT(domain.ValidateCorpusValue( + internal::corpus_type_t< + internal::FlatbuffersEnumDomainImpl>(255ul)), StatusIs(absl::StatusCode::kInvalidArgument)); } } diff --git a/fuzztest/internal/domains/flatbuffers_domain_impl.h b/fuzztest/internal/domains/flatbuffers_domain_impl.h index 394921f7b..1482a5988 100644 --- a/fuzztest/internal/domains/flatbuffers_domain_impl.h +++ b/fuzztest/internal/domains/flatbuffers_domain_impl.h @@ -16,7 +16,6 @@ #define FUZZTEST_FUZZTEST_INTERNAL_DOMAINS_FLATBUFFERS_DOMAIN_IMPL_H_ #include -#include #include #include #include @@ -187,11 +186,11 @@ auto VisitFlatbufferField(const reflection::Schema* absl_nonnull schema, } // Flatbuffers enum domain implementation. -template +template class FlatbuffersEnumDomainImpl : public domain_implementor::DomainBase< - /*Derived=*/FlatbuffersEnumDomainImpl, - /*ValueType=*/Underlaying, + /*Derived=*/FlatbuffersEnumDomainImpl, + /*ValueType=*/Underlying, /*CorpusType=*/ElementOfImplCorpusType> { public: using typename FlatbuffersEnumDomainImpl::DomainBase::corpus_type; @@ -204,7 +203,7 @@ class FlatbuffersEnumDomainImpl std::initializer_list excluded_values) { excluded_values_ = {excluded_values.begin(), excluded_values.end()}; inner_ = - ElementOfImpl(GetEnumValues(enum_def_, excluded_values)); + ElementOfImpl(GetEnumValues(enum_def_, excluded_values)); return *this; } @@ -236,15 +235,7 @@ class FlatbuffersEnumDomainImpl } absl::Status ValidateCorpusValue(const corpus_type& corpus_value) const { - for (const auto* value : *enum_def_->values()) { - if (excluded_values_.contains(value->value())) continue; - if (value->value() == static_cast(corpus_value)) { - return absl::OkStatus(); - } - } - return absl::InvalidArgumentError(absl::StrCat("Enum value ", corpus_value, - " is not valid for enum ", - enum_def_->name()->str())); + return inner_.ValidateCorpusValue(corpus_value); } auto GetPrinter() const { return Printer{*this}; } @@ -252,7 +243,7 @@ class FlatbuffersEnumDomainImpl private: const reflection::Enum* enum_def_; absl::flat_hash_set excluded_values_; - ElementOfImpl inner_; + ElementOfImpl inner_; static std::vector GetEnumValues( const reflection::Enum* enum_def,