summaryrefslogtreecommitdiff
path: root/libc/fuzzing/stdlib/StringParserOutputDiff.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/fuzzing/stdlib/StringParserOutputDiff.h')
-rw-r--r--libc/fuzzing/stdlib/StringParserOutputDiff.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/libc/fuzzing/stdlib/StringParserOutputDiff.h b/libc/fuzzing/stdlib/StringParserOutputDiff.h
new file mode 100644
index 000000000000..457da3b5674b
--- /dev/null
+++ b/libc/fuzzing/stdlib/StringParserOutputDiff.h
@@ -0,0 +1,35 @@
+//===-- Template to diff single-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_STDLIB_STRING_PARSER_OUTPUT_DIFF_H
+#define LLVM_LIBC_FUZZING_STDLIB_STRING_PARSER_OUTPUT_DIFF_H
+
+#include "fuzzing/math/Compare.h"
+
+#include <stddef.h>
+#include <stdint.h>
+
+template <typename T> using StringInputSingleOutputFunc = T (*)(const char *);
+
+template <typename T>
+void StringParserOutputDiff(StringInputSingleOutputFunc<T> func1,
+ StringInputSingleOutputFunc<T> func2,
+ const uint8_t *data, size_t size) {
+ if (size < sizeof(T))
+ return;
+
+ const char *x = reinterpret_cast<const char *>(data);
+
+ T result1 = func1(x);
+ T result2 = func2(x);
+
+ if (!ValuesEqual(result1, result2))
+ __builtin_trap();
+}
+
+#endif // LLVM_LIBC_FUZZING_STDLIB_STRING_PARSER_OUTPUT_DIFF_H