diff --git a/icu4c/source/test/fuzzer/Makefile.in b/icu4c/source/test/fuzzer/Makefile.in index 8843df547f7..e39ac8c4c6a 100644 --- a/icu4c/source/test/fuzzer/Makefile.in +++ b/icu4c/source/test/fuzzer/Makefile.in @@ -50,11 +50,11 @@ FUZZER_TARGETS = \ uloc_get_name_fuzzer \ uloc_is_right_to_left_fuzzer \ uloc_open_keywords_fuzzer \ + unicodeset_fuzzer \ unicode_string_codepage_create_fuzzer \ uprop_fuzzer \ uregex_open_fuzzer \ - OBJECTS = $(FUZZER_TARGETS:%=%.o) OBJECTS += fuzzer_driver.o locale_util.o diff --git a/icu4c/source/test/fuzzer/unicodeset_fuzzer.cpp b/icu4c/source/test/fuzzer/unicodeset_fuzzer.cpp new file mode 100644 index 00000000000..f72b4f47100 --- /dev/null +++ b/icu4c/source/test/fuzzer/unicodeset_fuzzer.cpp @@ -0,0 +1,57 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include + +#include "fuzzer_utils.h" +#include "unicode/coll.h" +#include "unicode/localpointer.h" +#include "unicode/uniset.h" + +IcuEnvironment* env = new IcuEnvironment(); + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + UErrorCode status = U_ZERO_ERROR; + + size_t unistr_size = size/2; + std::unique_ptr fuzzbuff(new char16_t[unistr_size]); + std::memcpy(fuzzbuff.get(), data, unistr_size * 2); + icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size); + + icu::LocalPointer set( + new icu::UnicodeSet(fuzzstr, status)); + + status = U_ZERO_ERROR; + + set.adoptInstead(new icu::UnicodeSet()); + set->applyPattern (fuzzstr, status); + + set.adoptInstead(new icu::UnicodeSet()); + set->addAll(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->add(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->retainAll(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->complementAll(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->removeAll(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->retain(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->remove(fuzzstr); + + set.adoptInstead(new icu::UnicodeSet()); + set->complement(fuzzstr); + + set.adoptInstead(icu::UnicodeSet::createFrom(fuzzstr)); + + set.adoptInstead(icu::UnicodeSet::createFromAll(fuzzstr)); + return 0; +}