Skip to content

Commit

Permalink
ICU-22549 Add fuzzer for NumberFormatter
Browse files Browse the repository at this point in the history
  • Loading branch information
FrankYFTang committed Dec 1, 2023
1 parent 368d673 commit e8e1945
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
1 change: 1 addition & 0 deletions icu4c/source/test/fuzzer/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ FUZZER_TARGETS = \
list_format_fuzzer locale_fuzzer \
locale_morph_fuzzer \
number_format_fuzzer \
number_formatter_fuzzer \
relative_date_time_formatter_fuzzer \
rule_based_break_iterator_fuzzer \
ucasemap_fuzzer \
Expand Down
45 changes: 45 additions & 0 deletions icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// © 2019 and later: Unicode, Inc. and others.
// License & terms of use: http:https://www.unicode.org/copyright.html

#include <cstring>

#include "fuzzer_utils.h"
#include "unicode/localpointer.h"
#include "unicode/numberformatter.h"

IcuEnvironment* env = new IcuEnvironment();

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
UErrorCode status = U_ZERO_ERROR;

int16_t rnd;
int64_t value;
double doubleValue;
if (size < sizeof(rnd) + sizeof(value) + sizeof(doubleValue)) return 0;
icu::StringPiece fuzzData(reinterpret_cast<const char *>(data), size);

std::memcpy(&rnd, fuzzData.data(), sizeof(rnd));
icu::Locale locale = GetRandomLocale(rnd);
fuzzData.remove_prefix(sizeof(rnd));

std::memcpy(&value, fuzzData.data(), sizeof(value));
fuzzData.remove_prefix(sizeof(value));

std::memcpy(&doubleValue, fuzzData.data(), sizeof(doubleValue));
fuzzData.remove_prefix(sizeof(doubleValue));

size_t len = fuzzData.size() / sizeof(char16_t);
icu::UnicodeString fuzzstr(false, reinterpret_cast<const char16_t*>(fuzzData.data()), len);

icu::number::UnlocalizedNumberFormatter unf = icu::number::NumberFormatter::forSkeleton(
fuzzstr, status);

icu::number::LocalizedNumberFormatter nf = unf.locale(locale);

status = U_ZERO_ERROR;
nf.formatInt(value, status);

status = U_ZERO_ERROR;
nf.formatDouble(doubleValue, status);
return 0;
}

0 comments on commit e8e1945

Please sign in to comment.