diff options
| author | Siva Chandra Reddy <sivachandra@google.com> | 2020-11-19 12:51:04 -0800 |
|---|---|---|
| committer | Siva Chandra Reddy <sivachandra@google.com> | 2020-11-20 07:46:15 -0800 |
| commit | 4766a86cf2f9ac47b1a0288fde84dc74f55b3f11 (patch) | |
| tree | c6ce6ed6b83a5d2576d10bb117705915d85de96b /libc/fuzzing/math/TwoInputSingleOutputDiff.h | |
| parent | 6f1c07b23a1ce012ed614f411776cea019d6e51a (diff) | |
[libc] Combine all math differential fuzzers into one target.
Also added diffing of a few more math functions. Combining the diff check
for all of these functions helps us meet the OSS fuzz bar of a minimum of
100 program edges.
Reviewed By: lntue
Differential Revision: https://reviews.llvm.org/D91817
Diffstat (limited to 'libc/fuzzing/math/TwoInputSingleOutputDiff.h')
| -rw-r--r-- | libc/fuzzing/math/TwoInputSingleOutputDiff.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libc/fuzzing/math/TwoInputSingleOutputDiff.h b/libc/fuzzing/math/TwoInputSingleOutputDiff.h new file mode 100644 index 000000000000..2888a5b76d71 --- /dev/null +++ b/libc/fuzzing/math/TwoInputSingleOutputDiff.h @@ -0,0 +1,40 @@ +//===-- Template to diff two-input-single-output functions ------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_FUZZING_MATH_TWO_INPUT_SINGLE_OUTPUT_DIFF_H +#define LLVM_LIBC_FUZZING_MATH_TWO_INPUT_SINGLE_OUTPUT_DIFF_H + +#include "fuzzing/math/Compare.h" +#include "utils/FPUtil/FPBits.h" + +#include <math.h> +#include <stddef.h> +#include <stdint.h> + +template <typename T1, typename T2> +using TwoInputSingleOutputFunc = T1 (*)(T1, T2); + +template <typename T1, typename T2> +void TwoInputSingleOutputDiff(TwoInputSingleOutputFunc<T1, T2> func1, + TwoInputSingleOutputFunc<T1, T2> func2, + const uint8_t *data, size_t size) { + constexpr size_t t1Size = sizeof(T1); + if (size < t1Size + sizeof(T2)) + return; + + T1 x = *reinterpret_cast<const T1 *>(data); + T2 y = *reinterpret_cast<const T2 *>(data + t1Size); + + T1 result1 = func1(x, y); + T1 result2 = func2(x, y); + + if (!ValuesEqual(result1, result2)) + __builtin_trap(); +} + +#endif // LLVM_LIBC_FUZZING_MATH_TWO_INPUT_SINGLE_OUTPUT_DIFF_H |
