From ba4e8f2ef7feed2fe43c5e84a4540c793a2843c8 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Wed, 29 Nov 2023 12:51:21 -0800 Subject: [PATCH] ICU-22549 Add Fuzer for Unicode property API --- icu4c/source/test/fuzzer/Makefile.in | 22 +++++++++++- icu4c/source/test/fuzzer/uprop_fuzzer.cpp | 44 +++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 icu4c/source/test/fuzzer/uprop_fuzzer.cpp diff --git a/icu4c/source/test/fuzzer/Makefile.in b/icu4c/source/test/fuzzer/Makefile.in index 9ee25d703ca7..8843df547f73 100644 --- a/icu4c/source/test/fuzzer/Makefile.in +++ b/icu4c/source/test/fuzzer/Makefile.in @@ -33,7 +33,27 @@ CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcd DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"' LIBS = $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -FUZZER_TARGETS = break_iterator_fuzzer calendar_fuzzer collator_compare_fuzzer collator_rulebased_fuzzer converter_fuzzer date_format_fuzzer date_time_pattern_generator_fuzzer list_format_fuzzer locale_fuzzer locale_morph_fuzzer number_format_fuzzer relative_date_time_formatter_fuzzer rule_based_break_iterator_fuzzer ucasemap_fuzzer uloc_canonicalize_fuzzer uloc_for_language_tag_fuzzer uloc_get_name_fuzzer uloc_is_right_to_left_fuzzer uloc_open_keywords_fuzzer unicode_string_codepage_create_fuzzer uregex_open_fuzzer +FUZZER_TARGETS = \ + break_iterator_fuzzer \ + calendar_fuzzer collator_compare_fuzzer \ + collator_rulebased_fuzzer \ + converter_fuzzer date_format_fuzzer \ + date_time_pattern_generator_fuzzer \ + list_format_fuzzer locale_fuzzer \ + locale_morph_fuzzer \ + number_format_fuzzer \ + relative_date_time_formatter_fuzzer \ + rule_based_break_iterator_fuzzer \ + ucasemap_fuzzer \ + uloc_canonicalize_fuzzer \ + uloc_for_language_tag_fuzzer \ + uloc_get_name_fuzzer \ + uloc_is_right_to_left_fuzzer \ + uloc_open_keywords_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/uprop_fuzzer.cpp b/icu4c/source/test/fuzzer/uprop_fuzzer.cpp new file mode 100644 index 000000000000..c1f094eca3c6 --- /dev/null +++ b/icu4c/source/test/fuzzer/uprop_fuzzer.cpp @@ -0,0 +1,44 @@ +// © 2023 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// Fuzzer for ICU Unicode Property. + +#include + +#include "fuzzer_utils.h" + +#include "unicode/uchar.h" +#include "unicode/locid.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + UProperty prop; + UChar32 c32; + + if (size < sizeof(prop) + sizeof(c32)) return 0; + + icu::StringPiece fuzzData(reinterpret_cast(data), size); + + std::memcpy(&prop, fuzzData.data(), sizeof(prop)); + fuzzData.remove_prefix(sizeof(prop)); + + std::memcpy(&c32, fuzzData.data(), sizeof(c32)); + fuzzData.remove_prefix(sizeof(c32)); + + u_hasBinaryProperty(c32, prop); + + UErrorCode status = U_ZERO_ERROR; + u_getBinaryPropertySet(prop, &status); + + u_getIntPropertyValue(c32, prop); + u_getIntPropertyMinValue(prop); + u_getIntPropertyMaxValue(prop); + + status = U_ZERO_ERROR; + u_getIntPropertyMap(prop, &status); + + size_t unistr_size = fuzzData.length()/2; + const UChar* p = (const UChar*)(fuzzData.data()); + u_stringHasBinaryProperty(p, unistr_size, prop); + + return 0; +}