Skip to content

[libc] sqrt and log functions fuzz tests #148006

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

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

sribee8
Copy link
Contributor

@sribee8 sribee8 commented Jul 10, 2025

added fuzz tests for sqrt and log functions

added fuzz tests for sqrt and log functions
@llvmbot llvmbot added the libc label Jul 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-libc

Author: None (sribee8)

Changes

added fuzz tests for sqrt and log functions


Full diff: https://github.com/llvm/llvm-project/pull/148006.diff

7 Files Affected:

  • (modified) libc/fuzzing/math/CMakeLists.txt (+45)
  • (added) libc/fuzzing/math/log10_fuzz.cpp (+38)
  • (added) libc/fuzzing/math/log1p_fuzz.cpp (+38)
  • (added) libc/fuzzing/math/log2_fuzz.cpp (+38)
  • (added) libc/fuzzing/math/log_fuzz.cpp (+38)
  • (modified) libc/fuzzing/math/sincos_fuzz.cpp (+1-1)
  • (added) libc/fuzzing/math/sqrt_fuzz.cpp (+38)
diff --git a/libc/fuzzing/math/CMakeLists.txt b/libc/fuzzing/math/CMakeLists.txt
index e3c29651917fc..06f8f024762b9 100644
--- a/libc/fuzzing/math/CMakeLists.txt
+++ b/libc/fuzzing/math/CMakeLists.txt
@@ -124,3 +124,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.math.sqrt
+)
diff --git a/libc/fuzzing/math/log10_fuzz.cpp b/libc/fuzzing/math/log10_fuzz.cpp
new file mode 100644
index 0000000000000..b5233588e83f8
--- /dev/null
+++ b/libc/fuzzing/math/log10_fuzz.cpp
@@ -0,0 +1,38 @@
+//===-- 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 <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(double x) {
+  // 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_t input;
+  mpfr_init2(input, 53);
+  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)
+    __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 0000000000000..c40aad018794f
--- /dev/null
+++ b/libc/fuzzing/math/log1p_fuzz.cpp
@@ -0,0 +1,38 @@
+//===-- 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 <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(double x) {
+  // 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_t input;
+  mpfr_init2(input, 53);
+  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)
+    __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 0000000000000..3a7d9956b4bea
--- /dev/null
+++ b/libc/fuzzing/math/log2_fuzz.cpp
@@ -0,0 +1,38 @@
+//===-- 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 <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(double x) {
+  // 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_t input;
+  mpfr_init2(input, 53);
+  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)
+    __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 0000000000000..1271fb73fd1a0
--- /dev/null
+++ b/libc/fuzzing/math/log_fuzz.cpp
@@ -0,0 +1,38 @@
+//===-- 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 <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(double x) {
+  // 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_t input;
+  mpfr_init2(input, 53);
+  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)
+    __builtin_trap();
+
+  mpfr_clear(input);
+  return 0;
+}
diff --git a/libc/fuzzing/math/sincos_fuzz.cpp b/libc/fuzzing/math/sincos_fuzz.cpp
index 8cc6f7291a3df..fd3dfae23168c 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 0000000000000..48e17f481a256
--- /dev/null
+++ b/libc/fuzzing/math/sqrt_fuzz.cpp
@@ -0,0 +1,38 @@
+//===-- 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/math/sqrt.h"
+#include "utils/MPFRWrapper/mpfr_inc.h"
+#include <math.h>
+
+extern "C" int LLVMFuzzerTestOneInput(double x) {
+  // 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_t input;
+  mpfr_init2(input, 53);
+  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::sqrt(x);
+
+  if (result != to_compare)
+    __builtin_trap();
+
+  mpfr_clear(input);
+  return 0;
+}

@sribee8 sribee8 requested a review from lntue July 10, 2025 17:13

extern "C" int LLVMFuzzerTestOneInput(double x) {
// remove NaN and inf and values outside accepted range
if (isnan(x) || isinf(x) || x < 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

log1p(x) meaningful range is x >= -1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants