xref: /llvm-project/libc/fuzzing/math/sin_fuzz.cpp (revision 2d95dee0c06687814eeb5c883e305a7197e26a95)
10142bd6bSRoseZhang03 //===-- sin_fuzz.cpp ------------------------------------------------------===//
290065da6SRoseZhang03 //
390065da6SRoseZhang03 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
490065da6SRoseZhang03 // See https://llvm.org/LICENSE.txt for license information.
590065da6SRoseZhang03 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
690065da6SRoseZhang03 //
790065da6SRoseZhang03 //===----------------------------------------------------------------------===//
890065da6SRoseZhang03 ///
990065da6SRoseZhang03 /// Fuzzing test for llvm-libc sin implementation.
1090065da6SRoseZhang03 ///
1190065da6SRoseZhang03 //===----------------------------------------------------------------------===//
1290065da6SRoseZhang03 
1390065da6SRoseZhang03 #include "src/math/sin.h"
14*2d95dee0SRoseZhang03 #include "utils/MPFRWrapper/mpfr_inc.h"
15b45d3629SRoseZhang03 #include <math.h>
1690065da6SRoseZhang03 
1790065da6SRoseZhang03 extern "C" int LLVMFuzzerTestOneInput(const double x) {
1890065da6SRoseZhang03   // remove NaN and inf as preconditions
19b45d3629SRoseZhang03   if (isnan(x))
2090065da6SRoseZhang03     return 0;
21b45d3629SRoseZhang03   if (isinf(x))
2290065da6SRoseZhang03     return 0;
2390065da6SRoseZhang03   // signed zeros already tested in unit tests
24b45d3629SRoseZhang03   if (signbit(x) && x == 0.0)
2590065da6SRoseZhang03     return 0;
2690065da6SRoseZhang03   mpfr_t input;
2790065da6SRoseZhang03   mpfr_init2(input, 53);
2890065da6SRoseZhang03   mpfr_set_d(input, x, MPFR_RNDN);
2990065da6SRoseZhang03   int output = mpfr_sin(input, input, MPFR_RNDN);
3090065da6SRoseZhang03   mpfr_subnormalize(input, output, MPFR_RNDN);
3190065da6SRoseZhang03   double to_compare = mpfr_get_d(input, MPFR_RNDN);
3290065da6SRoseZhang03 
3390065da6SRoseZhang03   double result = LIBC_NAMESPACE::sin(x);
3490065da6SRoseZhang03 
3590065da6SRoseZhang03   if (result != to_compare)
3690065da6SRoseZhang03     __builtin_trap();
3790065da6SRoseZhang03 
3890065da6SRoseZhang03   mpfr_clear(input);
3990065da6SRoseZhang03   return 0;
4090065da6SRoseZhang03 }
41