]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/fuzzer/break_iterator_fuzzer.cc
1 // © 2019 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
9 #include "fuzzer_utils.h"
10 #include "unicode/brkiter.h"
11 #include "unicode/utext.h"
13 IcuEnvironment
* env
= new IcuEnvironment();
15 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data
, size_t size
) {
16 UErrorCode status
= U_ZERO_ERROR
;
23 // Extract one and two bytes from fuzzer data for random selection purpose.
26 rnd16
= *(reinterpret_cast<const uint16_t *>(data
));
30 size_t unistr_size
= size
/2;
31 std::unique_ptr
<char16_t[]> fuzzbuff(new char16_t[unistr_size
]);
32 std::memcpy(fuzzbuff
.get(), data
, unistr_size
* 2);
34 UText
* fuzzstr
= utext_openUChars(nullptr, fuzzbuff
.get(), unistr_size
, &status
);
36 const icu::Locale
& locale
= GetRandomLocale(rnd16
);
38 std::unique_ptr
<icu::BreakIterator
> bi
;
42 bi
.reset(icu::BreakIterator::createWordInstance(locale
, status
));
45 bi
.reset(icu::BreakIterator::createLineInstance(locale
, status
));
48 bi
.reset(icu::BreakIterator::createCharacterInstance(locale
, status
));
51 bi
.reset(icu::BreakIterator::createSentenceInstance(locale
, status
));
54 bi
.reset(icu::BreakIterator::createTitleInstance(locale
, status
));
58 bi
->setText(fuzzstr
, status
);
60 if (U_FAILURE(status
)) {
65 for (int32_t p
= bi
->first(); p
!= icu::BreakIterator::DONE
; p
= bi
->next()) {}