[libc-commits] [libc] [libc] created fuzz test for sin function (PR #101411)

via libc-commits libc-commits at lists.llvm.org
Wed Jul 31 20:26:23 PDT 2024


https://github.com/RoseZhang03 updated https://github.com/llvm/llvm-project/pull/101411

>From eb88010edabbba9652077bc24e502ae30d6d5cac Mon Sep 17 00:00:00 2001
From: Rose Zhang <rosezhang at google.com>
Date: Wed, 31 Jul 2024 20:51:11 +0000
Subject: [PATCH 1/2] [libc] created fuzz test for sin function

Verifies that sin function output is correct by comparing with MPFR
output. NaN and inf are not tested (as our output will vary compared to
MPFR), and signed zeroes are already tested in unit tests.
---
 libc/fuzzing/CMakeLists.txt      |  2 +-
 libc/fuzzing/math/CMakeLists.txt |  9 +++++++
 libc/fuzzing/math/sin_fuzz.cpp   | 40 ++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 libc/fuzzing/math/sin_fuzz.cpp

diff --git a/libc/fuzzing/CMakeLists.txt b/libc/fuzzing/CMakeLists.txt
index 816691b4bd440..e2dcecca7f7df 100644
--- a/libc/fuzzing/CMakeLists.txt
+++ b/libc/fuzzing/CMakeLists.txt
@@ -3,7 +3,7 @@ add_custom_target(libc-fuzzer)
 
 add_subdirectory(__support)
 # TODO(#85680): Re-enable math fuzzing after headers are sorted out
-# add_subdirectory(math)
+add_subdirectory(math)
 add_subdirectory(stdlib)
 add_subdirectory(stdio)
 add_subdirectory(string)
diff --git a/libc/fuzzing/math/CMakeLists.txt b/libc/fuzzing/math/CMakeLists.txt
index 6990a04922a5c..ad163cc53eae3 100644
--- a/libc/fuzzing/math/CMakeLists.txt
+++ b/libc/fuzzing/math/CMakeLists.txt
@@ -61,3 +61,12 @@ add_libc_fuzzer(
     libc.src.math.nextafterf
     libc.src.math.nextafterl
 )
+
+add_libc_fuzzer(
+  sin_fuzz
+  NEED_MPFR
+  SRCS
+    sin_fuzz.cpp
+  DEPENDS
+    libc.src.math.sin
+)
diff --git a/libc/fuzzing/math/sin_fuzz.cpp b/libc/fuzzing/math/sin_fuzz.cpp
new file mode 100644
index 0000000000000..ee9eee5ae5bff
--- /dev/null
+++ b/libc/fuzzing/math/sin_fuzz.cpp
@@ -0,0 +1,40 @@
+//===-- sin_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 sin implementation.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/math/sin.h"
+#include <cmath>
+#include <mpfr.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const double x) {
+  // remove NaN and inf as preconditions
+  if (std::isnan(x))
+    return 0;
+  if (std::isinf(x))
+    return 0;
+  // signed zeros already tested in unit tests
+  if (std::signbit(x) && x == 0.0)
+    return 0;
+  mpfr_t input;
+  mpfr_init2(input, 64);
+  mpfr_set_d(input, x, MPFR_RNDN);
+  int output = mpfr_sin(input, input, MPFR_RNDN);
+  mpfr_subnormalize(input, output, MPFR_RNDN);
+  double to_compare = mpfr_get_d(input, MPFR_RNDN);
+
+  double result = LIBC_NAMESPACE::sin(x);
+
+  if (result != to_compare)
+    __builtin_trap();
+
+  mpfr_clear(input);
+  return 0;
+}

>From d0e548335d26f4d7b5ab339b94281c924e47e983 Mon Sep 17 00:00:00 2001
From: Rose Zhang <rosezhang at google.com>
Date: Thu, 1 Aug 2024 03:26:07 +0000
Subject: [PATCH 2/2] changed 64 bits to 53 bits

---
 libc/fuzzing/math/sin_fuzz.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/fuzzing/math/sin_fuzz.cpp b/libc/fuzzing/math/sin_fuzz.cpp
index ee9eee5ae5bff..1e607d461978d 100644
--- a/libc/fuzzing/math/sin_fuzz.cpp
+++ b/libc/fuzzing/math/sin_fuzz.cpp
@@ -24,7 +24,7 @@ extern "C" int LLVMFuzzerTestOneInput(const double x) {
   if (std::signbit(x) && x == 0.0)
     return 0;
   mpfr_t input;
-  mpfr_init2(input, 64);
+  mpfr_init2(input, 53);
   mpfr_set_d(input, x, MPFR_RNDN);
   int output = mpfr_sin(input, input, MPFR_RNDN);
   mpfr_subnormalize(input, output, MPFR_RNDN);



More information about the libc-commits mailing list