]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/fuzzer/ucasemap_fuzzer.cpp
1 // © 2019 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 // Fuzzer for ucasemap.
11 #include "fuzzer_utils.h"
12 #include "unicode/ucasemap.h"
14 IcuEnvironment
* env
= new IcuEnvironment();
17 using deleted_unique_ptr
= std::unique_ptr
<T
,std::function
<void(T
*)>>;
19 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data
, size_t size
) {
20 UErrorCode status
= U_ZERO_ERROR
;
28 // Extract one, two, and four bytes from fuzzer data for random selection
32 rnd16
= *(reinterpret_cast<const uint16_t *>(data
));
34 rnd32
= *(reinterpret_cast<const uint32_t *>(data
));
38 std::unique_ptr
<char[]> fuzzbuff(new char[size
]);
39 std::memcpy(fuzzbuff
.get(), data
, size
);
41 const icu::Locale
& locale
= GetRandomLocale(rnd16
);
42 uint32_t open_flags
= rnd32
;
44 deleted_unique_ptr
<UCaseMap
> csm(
45 ucasemap_open(locale
.getName(), open_flags
, &status
),
46 [](UCaseMap
* map
) { ucasemap_close(map
); });
48 if (U_FAILURE(status
)) {
52 int32_t dst_size
= size
* 2;
53 std::unique_ptr
<char[]> dst(new char[dst_size
]);
54 auto src
= reinterpret_cast<const char*>(fuzzbuff
.get());
57 case 0: ucasemap_utf8ToLower(csm
.get(), dst
.get(), dst_size
, src
, size
,
60 case 1: ucasemap_utf8ToUpper(csm
.get(), dst
.get(), dst_size
, src
, size
,
63 case 2: ucasemap_utf8ToTitle(csm
.get(), dst
.get(), dst_size
, src
, size
,
66 case 3: ucasemap_utf8FoldCase(csm
.get(), dst
.get(), dst_size
, src
, size
,