Skip to content

Commit a4b4aa1

Browse files
FrankYFTangcatamorphism
authored andcommitted
ICU-22549 Add DateTimePatternGenerator fuzzer
See unicode-org#2708
1 parent 57877d6 commit a4b4aa1

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

icu4c/source/test/fuzzer/Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcd
3333
DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
3434
LIBS = $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
3535

36-
FUZZER_TARGETS = break_iterator_fuzzer calendar_fuzzer collator_compare_fuzzer collator_rulebased_fuzzer converter_fuzzer date_format_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
36+
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
3737

3838
OBJECTS = $(FUZZER_TARGETS:%=%.o)
3939
OBJECTS += fuzzer_driver.o locale_util.o
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// © 2019 and later: Unicode, Inc. and others.
2+
// License & terms of use: http://www.unicode.org/copyright.html
3+
4+
#include <cstring>
5+
6+
#include "fuzzer_utils.h"
7+
#include "unicode/dtptngen.h"
8+
#include "unicode/localpointer.h"
9+
#include "unicode/locid.h"
10+
11+
IcuEnvironment* env = new IcuEnvironment();
12+
13+
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
14+
UErrorCode status = U_ZERO_ERROR;
15+
16+
uint16_t rnd16;
17+
18+
if (size < 2 + sizeof(rnd16))
19+
return 0;
20+
21+
std::memcpy(&rnd16, data, sizeof(rnd16));
22+
size -= sizeof(rnd16);
23+
data += sizeof(rnd16);
24+
const icu::Locale& locale = GetRandomLocale(rnd16);
25+
26+
std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[size/2]);
27+
std::memcpy(fuzzbuff.get(), data, (size/2)*2);
28+
icu::UnicodeString fuzzstr(false, fuzzbuff.get(), size/2);
29+
30+
icu::LocalPointer<icu::DateTimePatternGenerator > gen(
31+
icu::DateTimePatternGenerator::createInstance(locale, status), status);
32+
if (U_FAILURE(status))
33+
return 0;
34+
35+
status = U_ZERO_ERROR;
36+
gen->getSkeleton(fuzzstr, status);
37+
38+
status = U_ZERO_ERROR;
39+
gen->getBaseSkeleton(fuzzstr, status);
40+
41+
status = U_ZERO_ERROR;
42+
gen->getBaseSkeleton(fuzzstr, status);
43+
44+
status = U_ZERO_ERROR;
45+
gen->getPatternForSkeleton(fuzzstr);
46+
47+
status = U_ZERO_ERROR;
48+
gen->getBestPattern(fuzzstr, status);
49+
50+
status = U_ZERO_ERROR;
51+
icu::DateTimePatternGenerator::staticGetSkeleton(fuzzstr, status);
52+
53+
status = U_ZERO_ERROR;
54+
icu::DateTimePatternGenerator::staticGetBaseSkeleton (fuzzstr, status);
55+
return 0;
56+
}

0 commit comments

Comments
 (0)