]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/fuzzer/ucasemap_fuzzer.cc
1 // © 2019 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 // Fuzzer for ucasemap.
9 #include "fuzzer_utils.h"
10 #include "unicode/ucasemap.h"
12 IcuEnvironment
* env
= new IcuEnvironment();
15 using deleted_unique_ptr
= std::unique_ptr
<T
,std::function
<void(T
*)>>;
17 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data
, size_t size
) {
18 UErrorCode status
= U_ZERO_ERROR
;
26 // Extract one, two, and four bytes from fuzzer data for random selection
30 rnd16
= *(reinterpret_cast<const uint16_t *>(data
));
32 rnd32
= *(reinterpret_cast<const uint32_t *>(data
));
36 std::unique_ptr
<char[]> fuzzbuff(new char[size
]);
37 std::memcpy(fuzzbuff
.get(), data
, size
);
39 const icu::Locale
& locale
= GetRandomLocale(rnd16
);
40 uint32_t open_flags
= rnd32
;
42 deleted_unique_ptr
<UCaseMap
> csm(
43 ucasemap_open(locale
.getName(), open_flags
, &status
),
44 [](UCaseMap
* map
) { ucasemap_close(map
); });
46 if (U_FAILURE(status
)) {
50 int32_t dst_size
= size
* 2;
51 std::unique_ptr
<char[]> dst(new char[dst_size
]);
52 auto src
= reinterpret_cast<const char*>(fuzzbuff
.get());
55 case 0: ucasemap_utf8ToLower(csm
.get(), dst
.get(), dst_size
, src
, size
,
58 case 1: ucasemap_utf8ToUpper(csm
.get(), dst
.get(), dst_size
, src
, size
,
61 case 2: ucasemap_utf8ToTitle(csm
.get(), dst
.get(), dst_size
, src
, size
,
64 case 3: ucasemap_utf8FoldCase(csm
.get(), dst
.get(), dst_size
, src
, size
,