X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/a01113dcd0f39d5da295ef82785beff9ed86fe38..340931cb2e044a2141d11567dd0f782524e32994:/icuSources/test/fuzzer/break_iterator_fuzzer.cpp diff --git a/icuSources/test/fuzzer/break_iterator_fuzzer.cpp b/icuSources/test/fuzzer/break_iterator_fuzzer.cpp new file mode 100644 index 00000000..a2c9a3e9 --- /dev/null +++ b/icuSources/test/fuzzer/break_iterator_fuzzer.cpp @@ -0,0 +1,71 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include +#include +#include +#include +#include +#include +#include "fuzzer_utils.h" +#include "unicode/brkiter.h" +#include "unicode/utext.h" + +IcuEnvironment* env = new IcuEnvironment(); + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + UErrorCode status = U_ZERO_ERROR; + uint8_t rnd8 = 0; + uint16_t rnd16 = 0; + + if (size < 3) { + return 0; + } + // Extract one and two bytes from fuzzer data for random selection purpose. + rnd8 = *data; + data++; + rnd16 = *(reinterpret_cast(data)); + data = data + 2; + size = size - 3; + + size_t unistr_size = size/2; + std::unique_ptr fuzzbuff(new char16_t[unistr_size]); + std::memcpy(fuzzbuff.get(), data, unistr_size * 2); + + UText* fuzzstr = utext_openUChars(nullptr, fuzzbuff.get(), unistr_size, &status); + + const icu::Locale& locale = GetRandomLocale(rnd16); + + std::unique_ptr bi; + + switch (rnd8 % 5) { + case 0: + bi.reset(icu::BreakIterator::createWordInstance(locale, status)); + break; + case 1: + bi.reset(icu::BreakIterator::createLineInstance(locale, status)); + break; + case 2: + bi.reset(icu::BreakIterator::createCharacterInstance(locale, status)); + break; + case 3: + bi.reset(icu::BreakIterator::createSentenceInstance(locale, status)); + break; + case 4: + bi.reset(icu::BreakIterator::createTitleInstance(locale, status)); + break; + } + + bi->setText(fuzzstr, status); + + if (U_FAILURE(status)) { + utext_close(fuzzstr); + return 0; + } + + for (int32_t p = bi->first(); p != icu::BreakIterator::DONE; p = bi->next()) {} + + utext_close(fuzzstr); + return 0; +} +