-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc] created fuzz test for sin function #101411
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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.
@llvm/pr-subscribers-libc Author: None (RoseZhang03) ChangesVerifies that sin function output is correct by comparing with MPFR Full diff: https://github.com/llvm/llvm-project/pull/101411.diff 3 Files Affected:
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;
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall LGTM with one nit
libc/fuzzing/math/sin_fuzz.cpp
Outdated
if (std::signbit(x) && x == 0.0) | ||
return 0; | ||
mpfr_t input; | ||
mpfr_init2(input, 64); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For MPFR it's generally best to match exactly the precision you're trying to compare against. A double precision float has an effective precision of 53
since its mantissa is 52 bits + 1 for the implicit leading bit, so instead of 64
this number should be 53
.
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/43/builds/3483 Here is the relevant piece of the build log for the reference:
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/93/builds/3389 Here is the relevant piece of the build log for the reference:
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/147/builds/3381 Here is the relevant piece of the build log for the reference:
|
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.