Fix flatbuffers enum domain corpus validation PiperOrigin-RevId: 919552381
diff --git a/domain_tests/BUILD b/domain_tests/BUILD index 100fc80..0dfd652 100644 --- a/domain_tests/BUILD +++ b/domain_tests/BUILD
@@ -50,7 +50,6 @@ "@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 ecf92b7..be59c47 100644 --- a/domain_tests/CMakeLists.txt +++ b/domain_tests/CMakeLists.txt
@@ -33,7 +33,6 @@ 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 3d397a2..508ad26 100644 --- a/domain_tests/arbitrary_domains_flatbuffers_test.cc +++ b/domain_tests/arbitrary_domains_flatbuffers_test.cc
@@ -213,26 +213,17 @@ internal::FlatbuffersEnumDomainImpl<uint8_t>(enum_def).WithExcludedValues( {internal::ByteEnum_First}); { - auto invalid_value = - static_cast<internal::FlatbuffersEnumDomainImpl<uint8_t>::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<internal::FlatbuffersEnumDomainImpl<uint8_t>::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<internal::FlatbuffersEnumDomainImpl<uint8_t>::corpus_type>( - internal::ByteEnum_First); - EXPECT_THAT(domain.ValidateCorpusValue(invalid_value), + EXPECT_THAT(domain.ValidateCorpusValue( + internal::corpus_type_t< + internal::FlatbuffersEnumDomainImpl<uint8_t>>(255ul)), StatusIs(absl::StatusCode::kInvalidArgument)); } }
diff --git a/fuzztest/internal/domains/flatbuffers_domain_impl.h b/fuzztest/internal/domains/flatbuffers_domain_impl.h index 394921f..1482a59 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 <algorithm> -#include <cstddef> #include <cstdint> #include <initializer_list> #include <limits> @@ -187,11 +186,11 @@ } // Flatbuffers enum domain implementation. -template <typename Underlaying> +template <typename Underlying> class FlatbuffersEnumDomainImpl : public domain_implementor::DomainBase< - /*Derived=*/FlatbuffersEnumDomainImpl<Underlaying>, - /*ValueType=*/Underlaying, + /*Derived=*/FlatbuffersEnumDomainImpl<Underlying>, + /*ValueType=*/Underlying, /*CorpusType=*/ElementOfImplCorpusType> { public: using typename FlatbuffersEnumDomainImpl::DomainBase::corpus_type; @@ -204,7 +203,7 @@ std::initializer_list<value_type> excluded_values) { excluded_values_ = {excluded_values.begin(), excluded_values.end()}; inner_ = - ElementOfImpl<Underlaying>(GetEnumValues(enum_def_, excluded_values)); + ElementOfImpl<Underlying>(GetEnumValues(enum_def_, excluded_values)); return *this; } @@ -236,15 +235,7 @@ } 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<size_t>(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 @@ private: const reflection::Enum* enum_def_; absl::flat_hash_set<value_type> excluded_values_; - ElementOfImpl<Underlaying> inner_; + ElementOfImpl<Underlying> inner_; static std::vector<value_type> GetEnumValues( const reflection::Enum* enum_def,