From 869713b65fd11bf8bf3c758a4dd75bdaa8d717ca Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Fri, 1 Sep 2023 23:33:48 +0000 Subject: [PATCH] ICU-22479 Improve collator_compare_fuzzer See #2574 --- .../test/fuzzer/collator_compare_fuzzer.cpp | 25 +++++++++++++++--- .../collator_compare_fuzzer_seed_corpus.txt | Bin 0 -> 10526 bytes 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 icu4c/source/test/fuzzer/collator_compare_fuzzer_seed_corpus.txt diff --git a/icu4c/source/test/fuzzer/collator_compare_fuzzer.cpp b/icu4c/source/test/fuzzer/collator_compare_fuzzer.cpp index 87b2ea98c2c7..149038e53ece 100644 --- a/icu4c/source/test/fuzzer/collator_compare_fuzzer.cpp +++ b/icu4c/source/test/fuzzer/collator_compare_fuzzer.cpp @@ -1,6 +1,7 @@ // © 2019 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +#include #include #include "fuzzer_utils.h" @@ -10,23 +11,41 @@ IcuEnvironment* env = new IcuEnvironment(); +static const std::array kStrength = { + icu::Collator::PRIMARY, + icu::Collator::SECONDARY, + icu::Collator::TERTIARY, + icu::Collator::QUATERNARY, + icu::Collator::IDENTICAL +}; + extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { UErrorCode status = U_ZERO_ERROR; - if (size < 2) + uint16_t rnd16; + + if (size < 2 + sizeof(rnd16)) return 0; + std::memcpy(&rnd16, data, sizeof(rnd16)); + size -= sizeof(rnd16); + data += sizeof(rnd16); + icu::Collator::ECollationStrength strength = kStrength[rnd16 % kStrength.size()]; + const icu::Locale& locale = GetRandomLocale(rnd16 / kStrength.size()); + std::unique_ptr compbuff1(new char16_t[size/4]); std::memcpy(compbuff1.get(), data, (size/4)*2); data = data + size/2; std::unique_ptr compbuff2(new char16_t[size/4]); std::memcpy(compbuff2.get(), data, (size/4)*2); + icu::LocalPointer fuzzCollator( - icu::Collator::createInstance(icu::Locale::getUS(), status), status); + icu::Collator::createInstance(locale, status), status); if (U_FAILURE(status)) return 0; - fuzzCollator->setStrength(icu::Collator::TERTIARY); + + fuzzCollator->setStrength(strength); fuzzCollator->compare(compbuff1.get(), size/4, compbuff2.get(), size/4); diff --git a/icu4c/source/test/fuzzer/collator_compare_fuzzer_seed_corpus.txt b/icu4c/source/test/fuzzer/collator_compare_fuzzer_seed_corpus.txt new file mode 100644 index 0000000000000000000000000000000000000000..bdc6416a7a4c99cf28833c0d1be9e2e3feaca10c GIT binary patch literal 10526 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 OkJ%euiLD$Ik^ch6O