summaryrefslogtreecommitdiff
path: root/icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp')
-rw-r--r--icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp b/icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp
new file mode 100644
index 000000000..660d4be12
--- /dev/null
+++ b/icu4c/source/test/fuzzer/number_formatter_fuzzer.cpp
@@ -0,0 +1,45 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://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;
+}