aboutsummaryrefslogtreecommitdiff
path: root/libc/fuzzing
diff options
context:
space:
mode:
authorsribee8 <sriya.pratipati@gmail.com>2025-07-15 20:04:06 +0000
committerGitHub <noreply@github.com>2025-07-15 20:04:06 +0000
commitba95df17ece2f6a137ccf88dd95841889e285953 (patch)
treeb24d7ae3acf94417bab42ad5ad00c77926714005 /libc/fuzzing
parente5bc7e7df3adf1777194ccd4ffa4e69f39b811f0 (diff)
downloadllvm-ba95df17ece2f6a137ccf88dd95841889e285953.zip
llvm-ba95df17ece2f6a137ccf88dd95841889e285953.tar.gz
llvm-ba95df17ece2f6a137ccf88dd95841889e285953.tar.bz2
[libc] sqrt and log functions fuzz tests (#148006)
added fuzz tests for sqrt and log functions --------- Co-authored-by: Sriya Pratipati <sriyap@google.com>
Diffstat (limited to 'libc/fuzzing')
-rw-r--r--libc/fuzzing/math/CMakeLists.txt54
-rw-r--r--libc/fuzzing/math/atan_fuzz.cpp38
-rw-r--r--libc/fuzzing/math/log10_fuzz.cpp51
-rw-r--r--libc/fuzzing/math/log1p_fuzz.cpp50
-rw-r--r--libc/fuzzing/math/log2_fuzz.cpp51
-rw-r--r--libc/fuzzing/math/log_fuzz.cpp50
-rw-r--r--libc/fuzzing/math/sincos_fuzz.cpp2
-rw-r--r--libc/fuzzing/math/sqrt_fuzz.cpp50
8 files changed, 298 insertions, 48 deletions
diff --git a/libc/fuzzing/math/CMakeLists.txt b/libc/fuzzing/math/CMakeLists.txt
index bf2be5c..c1a9305 100644
--- a/libc/fuzzing/math/CMakeLists.txt
+++ b/libc/fuzzing/math/CMakeLists.txt
@@ -135,15 +135,6 @@ add_libc_fuzzer(
)
add_libc_fuzzer(
- atan_fuzz
- NEED_MPFR
- SRCS
- atan_fuzz.cpp
- DEPENDS
- libc.src.math.atan
-)
-
-add_libc_fuzzer(
tan_fuzz
NEED_MPFR
SRCS
@@ -160,3 +151,48 @@ add_libc_fuzzer(
DEPENDS
libc.src.math.sincos
)
+
+add_libc_fuzzer(
+ log_fuzz
+ NEED_MPFR
+ SRCS
+ log_fuzz.cpp
+ DEPENDS
+ libc.src.math.log
+)
+
+add_libc_fuzzer(
+ log10_fuzz
+ NEED_MPFR
+ SRCS
+ log10_fuzz.cpp
+ DEPENDS
+ libc.src.math.log10
+)
+
+add_libc_fuzzer(
+ log1p_fuzz
+ NEED_MPFR
+ SRCS
+ log1p_fuzz.cpp
+ DEPENDS
+ libc.src.math.log1p
+)
+
+add_libc_fuzzer(
+ log2_fuzz
+ NEED_MPFR
+ SRCS
+ log2_fuzz.cpp
+ DEPENDS
+ libc.src.math.log2
+)
+
+add_libc_fuzzer(
+ sqrt_fuzz
+ NEED_MPFR
+ SRCS
+ sqrt_fuzz.cpp
+ DEPENDS
+ libc.src.__support.FPUtil.generic.sqrt
+)
diff --git a/libc/fuzzing/math/atan_fuzz.cpp b/libc/fuzzing/math/atan_fuzz.cpp
deleted file mode 100644
index 3b48578..0000000
--- a/libc/fuzzing/math/atan_fuzz.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//===-- atan_fuzz.cpp -----------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// Fuzzing test for llvm-libc atan implementation.
-///
-//===----------------------------------------------------------------------===//
-
-#include "src/math/atan.h"
-#include "utils/MPFRWrapper/mpfr_inc.h"
-#include <math.h>
-
-extern "C" int LLVMFuzzerTestOneInput(double x) {
- // remove NaN and inf
- if (isnan(x) || isinf(x))
- return 0;
- // signed zeros already tested in unit tests
- if (signbit(x) && x == 0.0)
- return 0;
- mpfr_t input;
- mpfr_init2(input, 53);
- mpfr_set_d(input, x, MPFR_RNDN);
- int output = mpfr_atan(input, input, MPFR_RNDN);
- mpfr_subnormalize(input, output, MPFR_RNDN);
- double to_compare = mpfr_get_d(input, MPFR_RNDN);
-
- double result = LIBC_NAMESPACE::atan(x);
-
- if (result != to_compare)
- __builtin_trap();
-
- mpfr_clear(input);
- return 0;
-}
diff --git a/libc/fuzzing/math/log10_fuzz.cpp b/libc/fuzzing/math/log10_fuzz.cpp
new file mode 100644
index 0000000..23134f4
--- /dev/null
+++ b/libc/fuzzing/math/log10_fuzz.cpp
@@ -0,0 +1,51 @@
+//===-- log10_fuzz.cpp ----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// Fuzzing test for llvm-libc log10 implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/math/log10.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ mpfr_t input;
+ mpfr_init2(input, 53);
+ for (size_t i = 0; i < size / sizeof(double); ++i) {
+ double x;
+ std::memcpy(&x, data, sizeof(double));
+ data += sizeof(double);
+
+ // remove NaN and inf and values outside accepted range
+ if (isnan(x) || isinf(x) || x < 0)
+ return 0;
+ // signed zeros already tested in unit tests
+ if (signbit(x) && x == 0.0)
+ return 0;
+
+ mpfr_set_d(input, x, MPFR_RNDN);
+ int output = mpfr_log10(input, input, MPFR_RNDN);
+ mpfr_subnormalize(input, output, MPFR_RNDN);
+ double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+ double result = LIBC_NAMESPACE::log10(x);
+
+ if (result != to_compare) {
+ std::cout << std::hexfloat << "Failing input: " << x << std::endl;
+ std::cout << std::hexfloat << "Failing output: " << result << std::endl;
+ std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
+ __builtin_trap();
+ }
+ }
+ mpfr_clear(input);
+ return 0;
+}
diff --git a/libc/fuzzing/math/log1p_fuzz.cpp b/libc/fuzzing/math/log1p_fuzz.cpp
new file mode 100644
index 0000000..5e138a6
--- /dev/null
+++ b/libc/fuzzing/math/log1p_fuzz.cpp
@@ -0,0 +1,50 @@
+//===-- log1p_fuzz.cpp ----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// Fuzzing test for llvm-libc log1p implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/math/log1p.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ mpfr_t input;
+ mpfr_init2(input, 53);
+ for (size_t i = 0; i < size / sizeof(double); ++i) {
+ double x;
+ std::memcpy(&x, data, sizeof(double));
+ data += sizeof(double);
+ // remove NaN and inf and values outside accepted range
+ if (isnan(x) || isinf(x) || x < -1)
+ return 0;
+ // signed zeros already tested in unit tests
+ if (signbit(x) && x == 0.0)
+ return 0;
+
+ mpfr_set_d(input, x, MPFR_RNDN);
+ int output = mpfr_log1p(input, input, MPFR_RNDN);
+ mpfr_subnormalize(input, output, MPFR_RNDN);
+ double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+ double result = LIBC_NAMESPACE::log1p(x);
+
+ if (result != to_compare) {
+ std::cout << std::hexfloat << "Failing input: " << x << std::endl;
+ std::cout << std::hexfloat << "Failing output: " << result << std::endl;
+ std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
+ __builtin_trap();
+ }
+ }
+ mpfr_clear(input);
+ return 0;
+}
diff --git a/libc/fuzzing/math/log2_fuzz.cpp b/libc/fuzzing/math/log2_fuzz.cpp
new file mode 100644
index 0000000..aa19649
--- /dev/null
+++ b/libc/fuzzing/math/log2_fuzz.cpp
@@ -0,0 +1,51 @@
+//===-- log2_fuzz.cpp -----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// Fuzzing test for llvm-libc log2 implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/math/log2.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ mpfr_t input;
+ mpfr_init2(input, 53);
+ for (size_t i = 0; i < size / sizeof(double); ++i) {
+ double x;
+ std::memcpy(&x, data, sizeof(double));
+ data += sizeof(double);
+
+ // remove NaN and inf and values outside accepted range
+ if (isnan(x) || isinf(x) || x < 0)
+ return 0;
+ // signed zeros already tested in unit tests
+ if (signbit(x) && x == 0.0)
+ return 0;
+
+ mpfr_set_d(input, x, MPFR_RNDN);
+ int output = mpfr_log2(input, input, MPFR_RNDN);
+ mpfr_subnormalize(input, output, MPFR_RNDN);
+ double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+ double result = LIBC_NAMESPACE::log2(x);
+
+ if (result != to_compare) {
+ std::cout << std::hexfloat << "Failing input: " << x << std::endl;
+ std::cout << std::hexfloat << "Failing output: " << result << std::endl;
+ std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
+ __builtin_trap();
+ }
+ }
+ mpfr_clear(input);
+ return 0;
+}
diff --git a/libc/fuzzing/math/log_fuzz.cpp b/libc/fuzzing/math/log_fuzz.cpp
new file mode 100644
index 0000000..03aa678
--- /dev/null
+++ b/libc/fuzzing/math/log_fuzz.cpp
@@ -0,0 +1,50 @@
+//===-- log_fuzz.cpp ------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// Fuzzing test for llvm-libc log implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/math/log.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ mpfr_t input;
+ mpfr_init2(input, 53);
+ for (size_t i = 0; i < size / sizeof(double); ++i) {
+ double x;
+ std::memcpy(&x, data, sizeof(double));
+ data += sizeof(double);
+
+ // remove NaN and inf and values outside accepted range
+ if (isnan(x) || isinf(x) || x < 0)
+ return 0;
+ // signed zeros already tested in unit tests
+ if (signbit(x) && x == 0.0)
+ return 0;
+ mpfr_set_d(input, x, MPFR_RNDN);
+ int output = mpfr_log(input, input, MPFR_RNDN);
+ mpfr_subnormalize(input, output, MPFR_RNDN);
+ double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+ double result = LIBC_NAMESPACE::log(x);
+
+ if (result != to_compare) {
+ std::cout << std::hexfloat << "Failing input: " << x << std::endl;
+ std::cout << std::hexfloat << "Failing output: " << result << std::endl;
+ std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
+ __builtin_trap();
+ }
+ }
+ mpfr_clear(input);
+ return 0;
+}
diff --git a/libc/fuzzing/math/sincos_fuzz.cpp b/libc/fuzzing/math/sincos_fuzz.cpp
index 8cc6f72..fd3dfae 100644
--- a/libc/fuzzing/math/sincos_fuzz.cpp
+++ b/libc/fuzzing/math/sincos_fuzz.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
///
-/// Fuzzing test for llvm-libc cos implementation.
+/// Fuzzing test for llvm-libc sincos implementation.
///
//===----------------------------------------------------------------------===//
diff --git a/libc/fuzzing/math/sqrt_fuzz.cpp b/libc/fuzzing/math/sqrt_fuzz.cpp
new file mode 100644
index 0000000..e81cf1a
--- /dev/null
+++ b/libc/fuzzing/math/sqrt_fuzz.cpp
@@ -0,0 +1,50 @@
+//===-- sqrt_fuzz.cpp -----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// Fuzzing test for llvm-libc sqrt implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/FPUtil/generic/sqrt.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ mpfr_t input;
+ mpfr_init2(input, 53);
+ for (size_t i = 0; i < size / sizeof(double); ++i) {
+ double x;
+ std::memcpy(&x, data, sizeof(double));
+ data += sizeof(double);
+ // remove NaN and inf and values outside accepted range
+ if (isnan(x) || isinf(x) || x < 0)
+ return 0;
+ // signed zeros already tested in unit tests
+ if (signbit(x) && x == 0.0)
+ return 0;
+
+ mpfr_set_d(input, x, MPFR_RNDN);
+ int output = mpfr_sqrt(input, input, MPFR_RNDN);
+ mpfr_subnormalize(input, output, MPFR_RNDN);
+ double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+ double result = LIBC_NAMESPACE::fputil::sqrt<double>(x);
+
+ if (result != to_compare) {
+ std::cout << std::hexfloat << "Failing input: " << x << std::endl;
+ std::cout << std::hexfloat << "Failing output: " << result << std::endl;
+ std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
+ __builtin_trap();
+ }
+ }
+ mpfr_clear(input);
+ return 0;
+}