Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions libc/fuzzing/math/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,30 @@ add_libc_fuzzer(
DEPENDS
libc.src.math.cbrt
)

add_libc_fuzzer(
fsqrt_fuzz
NEED_MPFR
SRCS
fsqrt_fuzz.cpp
DEPENDS
libc.src.math.fsqrt
)

add_libc_fuzzer(
f16sqrt_fuzz
NEED_MPFR
SRCS
f16sqrt_fuzz.cpp
DEPENDS
libc.src.math.f16sqrt
)

add_libc_fuzzer(
hypot_fuzz
NEED_MPFR
SRCS
hypot_fuzz.cpp
DEPENDS
libc.src.math.hypot
)
56 changes: 56 additions & 0 deletions libc/fuzzing/math/f16sqrt_fuzz.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//===-- f16sqrt_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 f16sqrt implementation.
///
//===----------------------------------------------------------------------===//

#include "src/math/f16sqrt.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_t out;
mpfr_init2(input, 53);
mpfr_init2(out, 128);
for (size_t i = 0; i < size / sizeof(double); ++i) {
double x;
std::memcpy(&x, data, sizeof(double));
data += sizeof(double);

// remove NaN, inf, and values outside the accepted range
if (isnan(x) || isinf(x) || x < 0)
continue;
// signed zeros already tested in unit tests
if (signbit(x) && x == 0.0)
continue;

mpfr_set_d(input, x, MPFR_RNDN);
mpfr_sqrt(out, input, MPFR_RNDN);
float16 to_compare = mpfr_get_d(out, MPFR_RNDN);

float16 result = LIBC_NAMESPACE::f16sqrt(x);

if (result != to_compare) {
std::cout << std::hexfloat << "Failing input: " << x << std::endl;
std::cout << std::hexfloat
<< "Failing output: " << static_cast<float>(result)
<< std::endl;
std::cout << std::hexfloat
<< "Expected: " << static_cast<float>(to_compare) << std::endl;
__builtin_trap();
}
}
mpfr_clear(input);
mpfr_clear(out);
return 0;
}
53 changes: 53 additions & 0 deletions libc/fuzzing/math/fsqrt_fuzz.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//===-- fsqrt_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 fsqrt implementation.
///
//===----------------------------------------------------------------------===//

#include "src/math/fsqrt.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_t out;
mpfr_init2(input, 53);
mpfr_init2(out, 128);
for (size_t i = 0; i < size / sizeof(double); ++i) {
double x;
std::memcpy(&x, data, sizeof(double));
data += sizeof(double);

// remove NaN, inf, and values outside the accepted range
if (isnan(x) || isinf(x) || x < 0)
continue;
// signed zeros already tested in unit tests
if (signbit(x) && x == 0.0)
continue;

mpfr_set_d(input, x, MPFR_RNDN);
mpfr_sqrt(out, input, MPFR_RNDN);
float to_compare = mpfr_get_flt(out, MPFR_RNDN);

float result = LIBC_NAMESPACE::fsqrt(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);
mpfr_clear(out);
return 0;
}
64 changes: 64 additions & 0 deletions libc/fuzzing/math/hypot_fuzz.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//===-- hypot_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 hypot implementation.
///
//===----------------------------------------------------------------------===//

#include "src/math/hypot.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 in_x;
mpfr_t in_y;
mpfr_t out;
mpfr_init2(in_x, 53);
mpfr_init2(in_y, 53);
mpfr_init2(out, 128);

for (size_t i = 0; i < size / (2 * sizeof(double)); ++i) {
double x;
double y;

std::memcpy(&x, data, sizeof(double));
data += sizeof(double);
std::memcpy(&y, data, sizeof(double));
data += sizeof(double);

// remove NaN, inf, and signed zeros
if (isnan(x) || isinf(x) || (signbit(x) && x == 0.0))
return 0;
if (isnan(y) || isinf(y) || (signbit(y) && y == 0.0))
return 0;

mpfr_set_d(in_x, x, MPFR_RNDN);
mpfr_set_d(in_y, y, MPFR_RNDN);

int output = mpfr_hypot(out, in_x, in_y, MPFR_RNDN);
mpfr_subnormalize(out, output, MPFR_RNDN);
double to_compare = mpfr_get_d(out, MPFR_RNDN);

double result = LIBC_NAMESPACE::hypot(x, y);

if (result != to_compare) {
std::cout << std::hexfloat << "Failing x: " << x << std::endl;
std::cout << std::hexfloat << "Failing y: " << y << std::endl;
std::cout << std::hexfloat << "Failing output: " << result << std::endl;
std::cout << std::hexfloat << "Expected: " << to_compare << std::endl;
__builtin_trap();
}
}
mpfr_clear(in_x);
mpfr_clear(in_y);
mpfr_clear(out);
return 0;
}
Loading