From 4db89dbbc6f3f920303ec7672d04aeb3a9cd93ac Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Wed, 13 Dec 2023 18:02:21 -0800 Subject: [PATCH] ICU-22549 Add Normalizer2 Fuzzer ICU-22549 Remove unnecessary include files --- icu4c/source/test/fuzzer/Makefile.in | 1 + .../source/test/fuzzer/normalizer2_fuzzer.cpp | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 icu4c/source/test/fuzzer/normalizer2_fuzzer.cpp diff --git a/icu4c/source/test/fuzzer/Makefile.in b/icu4c/source/test/fuzzer/Makefile.in index ab217ed10ba1..a8b28540e325 100644 --- a/icu4c/source/test/fuzzer/Makefile.in +++ b/icu4c/source/test/fuzzer/Makefile.in @@ -41,6 +41,7 @@ FUZZER_TARGETS = \ date_time_pattern_generator_fuzzer \ list_format_fuzzer locale_fuzzer \ locale_morph_fuzzer \ + normalizer2_fuzzer \ number_format_fuzzer \ number_formatter_fuzzer \ relative_date_time_formatter_fuzzer \ diff --git a/icu4c/source/test/fuzzer/normalizer2_fuzzer.cpp b/icu4c/source/test/fuzzer/normalizer2_fuzzer.cpp new file mode 100644 index 000000000000..959da8c47b04 --- /dev/null +++ b/icu4c/source/test/fuzzer/normalizer2_fuzzer.cpp @@ -0,0 +1,79 @@ +// © 2023 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// Fuzzer for ICU Calendar. + +#include + +#include "unicode/normalizer2.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + uint16_t rnd; + UChar32 char1, char2; + if (size < sizeof(rnd) + sizeof(char1) + sizeof(char2)) return 0; + icu::StringPiece fuzzData(reinterpret_cast(data), size); + + std::memcpy(&rnd, fuzzData.data(), sizeof(rnd)); + fuzzData.remove_prefix(sizeof(rnd)); + std::memcpy(&char1, fuzzData.data(), sizeof(char1)); + fuzzData.remove_prefix(sizeof(char1)); + std::memcpy(&char2, fuzzData.data(), sizeof(char2)); + fuzzData.remove_prefix(sizeof(char2)); + + size_t len = fuzzData.size() / sizeof(char16_t); + icu::UnicodeString text(false, reinterpret_cast(fuzzData.data()), len); + + UErrorCode status = U_ZERO_ERROR; + const icu::Normalizer2* norm = nullptr; + switch (rnd % 6) { + case 0: + norm = icu::Normalizer2::getNFCInstance(status); + break; + case 1: + norm = icu::Normalizer2::getNFDInstance(status); + break; + case 2: + norm = icu::Normalizer2::getNFKCInstance(status); + break; + case 3: + norm = icu::Normalizer2::getNFKDInstance(status); + break; + case 4: + norm = icu::Normalizer2::getNFKCCasefoldInstance(status); + break; + case 5: + norm = icu::Normalizer2::getNFKCSimpleCasefoldInstance(status); + break; + } + if (U_SUCCESS(status)) { + norm->normalize(text, status); + status = U_ZERO_ERROR; + + icu::UnicodeString out; + + norm->normalize(text, out, status); + status = U_ZERO_ERROR; + + norm->normalizeSecondAndAppend(out, text, status); + status = U_ZERO_ERROR; + + norm->append(out, text, status); + status = U_ZERO_ERROR; + + norm->getDecomposition(char1, out); + norm->getRawDecomposition(char1, out); + norm->composePair(char1, char2); + norm->getCombiningClass(char1); + norm->isNormalized(text, status); + status = U_ZERO_ERROR; + + norm->quickCheck(text, status); + status = U_ZERO_ERROR; + + norm->hasBoundaryBefore(char1); + norm->hasBoundaryAfter(char1); + norm->isInert(char1); + } + + return EXIT_SUCCESS; +}