1 // © 2023 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3
4 // Fuzzer for ICU Calendar.
5
6 #include <cstring>
7
8 #include "fuzzer_utils.h"
9
10 #include "unicode/datefmt.h"
11 #include "unicode/locid.h"
12
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)13 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
14 uint16_t rnd;
15 uint8_t rnd2;
16 UDate date;
17 icu::DateFormat::EStyle styles[] = {
18 icu::DateFormat::EStyle::kNone,
19 icu::DateFormat::EStyle::kFull,
20 icu::DateFormat::EStyle::kLong,
21 icu::DateFormat::EStyle::kMedium,
22 icu::DateFormat::EStyle::kShort,
23 icu::DateFormat::EStyle::kDateOffset,
24 icu::DateFormat::EStyle::kDateTime,
25 icu::DateFormat::EStyle::kDateTimeOffset,
26 icu::DateFormat::EStyle::kRelative,
27 icu::DateFormat::EStyle::kFullRelative,
28 icu::DateFormat::EStyle::kLongRelative,
29 icu::DateFormat::EStyle::kMediumRelative,
30 icu::DateFormat::EStyle::kShortRelative,
31 };
32 int32_t numStyles = sizeof(styles) / sizeof(icu::DateFormat::EStyle);
33
34 icu::DateFormat::EStyle dateStyle;
35 icu::DateFormat::EStyle timeStyle;
36 if (size < sizeof(rnd) + sizeof(date) + 2*sizeof(rnd2) +
37 sizeof(dateStyle) + sizeof(timeStyle) ) {
38 return 0;
39 }
40 icu::StringPiece fuzzData(reinterpret_cast<const char *>(data), size);
41
42 std::memcpy(&rnd, fuzzData.data(), sizeof(rnd));
43 fuzzData.remove_prefix(sizeof(rnd));
44 icu::Locale locale = GetRandomLocale(rnd);
45
46 std::memcpy(&dateStyle, fuzzData.data(), sizeof(dateStyle));
47 fuzzData.remove_prefix(sizeof(dateStyle));
48 std::memcpy(&timeStyle, fuzzData.data(), sizeof(timeStyle));
49 fuzzData.remove_prefix(sizeof(timeStyle));
50
51 std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
52 icu::DateFormat::EStyle dateStyle2 = styles[rnd2 % numStyles];
53 fuzzData.remove_prefix(sizeof(rnd2));
54
55 std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
56 icu::DateFormat::EStyle timeStyle2 = styles[rnd2 % numStyles];
57 fuzzData.remove_prefix(sizeof(rnd2));
58
59 std::memcpy(&date, fuzzData.data(), sizeof(date));
60 fuzzData.remove_prefix(sizeof(date));
61
62 std::unique_ptr<icu::DateFormat> df(
63 icu::DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale));
64 icu::UnicodeString appendTo;
65 df->format(date, appendTo);
66
67 df.reset(
68 icu::DateFormat::createDateTimeInstance(dateStyle2, timeStyle2, locale));
69 appendTo.remove();
70 df->format(date, appendTo);
71 icu::UnicodeString skeleton = icu::UnicodeString::fromUTF8(fuzzData);
72
73 UErrorCode status = U_ZERO_ERROR;
74 appendTo.remove();
75 df.reset(icu::DateFormat::createInstanceForSkeleton(skeleton, status));
76 if (U_SUCCESS(status)) {
77 df->format(date, appendTo);
78 }
79
80 status = U_ZERO_ERROR;
81 appendTo.remove();
82 df.reset(icu::DateFormat::createInstanceForSkeleton(skeleton, locale, status));
83 if (U_SUCCESS(status)) {
84 df->format(date, appendTo);
85 }
86
87 std::string str(fuzzData.data(), fuzzData.size());
88 icu::Locale locale2(str.c_str());
89 df.reset(
90 icu::DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale2));
91 df.reset(
92 icu::DateFormat::createDateTimeInstance(dateStyle2, timeStyle2, locale2));
93 return EXIT_SUCCESS;
94 }
95