summaryrefslogtreecommitdiffstats
path: root/libcxx/fuzzing
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2018-01-18 16:52:19 +0000
committerMarshall Clow <mclow.lists@gmail.com>2018-01-18 16:52:19 +0000
commit4f0de28c77db8f6cfe15a56e8fa371be345476cd (patch)
tree11e826427cb8a041ecca8a233e0de4227542a0fb /libcxx/fuzzing
parent0a2193054b13b5c4cc89cc101cedc0b3f0240d4f (diff)
downloadbcm5719-llvm-4f0de28c77db8f6cfe15a56e8fa371be345476cd.tar.gz
bcm5719-llvm-4f0de28c77db8f6cfe15a56e8fa371be345476cd.zip
A simple program for testing OSS-Fuzz test cases locally.
llvm-svn: 322863
Diffstat (limited to 'libcxx/fuzzing')
-rw-r--r--libcxx/fuzzing/fuzz_test.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/libcxx/fuzzing/fuzz_test.cpp b/libcxx/fuzzing/fuzz_test.cpp
new file mode 100644
index 00000000000..a3cacfebbdf
--- /dev/null
+++ b/libcxx/fuzzing/fuzz_test.cpp
@@ -0,0 +1,111 @@
+// -*- C++ -*-
+//===------------------------- fuzz_test.cpp ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A simple program for running regressions on the fuzzing routines.
+// This code is not part of any shipping product.
+//
+// To build:
+// clang++ -std=c++11 fuzz_test.cpp fuzzing.cpp
+//
+// To use:
+// fuzz_test -r partial_sort [-v] files...
+//
+// Each file should contain a test case.
+
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <map>
+#include <chrono>
+
+#include "fuzzing.h"
+
+typedef int (*FuzzProc) (const uint8_t *data, size_t size);
+
+const std::map<std::string, FuzzProc> procs = {
+ {"sort", fuzzing::sort},
+ {"stable_sort", fuzzing::stable_sort},
+ {"partition", fuzzing::partition},
+ {"partition_copy", fuzzing::partition_copy},
+ {"stable_partition", fuzzing::stable_partition},
+ {"unique", fuzzing::unique},
+ {"unique_copy", fuzzing::unique_copy},
+ {"nth_element", fuzzing::nth_element},
+ {"partial_sort", fuzzing::partial_sort},
+ {"partial_sort_copy", fuzzing::partial_sort_copy},
+ {"make_heap", fuzzing::make_heap},
+ {"push_heap", fuzzing::push_heap},
+ {"pop_heap", fuzzing::pop_heap},
+ {"regex_ECMAScript", fuzzing::regex_ECMAScript},
+ {"regex_POSIX", fuzzing::regex_POSIX},
+ {"regex_extended", fuzzing::regex_extended},
+ {"regex_awk", fuzzing::regex_awk},
+ {"regex_grep", fuzzing::regex_grep},
+ {"regex_egrep", fuzzing::regex_egrep},
+ {"search", fuzzing::search}
+};
+
+
+
+bool verbose = false;
+
+void test_one(const char *filename, FuzzProc fp)
+{
+ std::vector<uint8_t> v;
+ std::ifstream f (filename, std::ios::binary);
+ if (!f.is_open())
+ std::cerr << "## Can't open '" << filename << "'" << std::endl;
+ else {
+ typedef std::istream_iterator<uint8_t> Iter;
+ std::copy(Iter(f), Iter(), std::back_inserter(v));
+ if (verbose)
+ std::cout << "File '" << filename << "' contains " << v.size() << " entries" << std::endl;
+ const auto start_time = std::chrono::steady_clock::now();
+ int ret = fp (v.data(), v.size());
+ const auto finish_time = std::chrono::steady_clock::now();
+ if (ret != 0)
+ std::cerr << "## Failure code: " << ret << std::endl;
+ if (verbose)
+ std::cout << "Execution time: "
+ << std::chrono::duration_cast<std::chrono::milliseconds>(finish_time - start_time).count()
+ << " milliseconds" << std::endl;
+ }
+}
+
+void usage (const char *name)
+{
+ std::cout << "Usage: " << name << " -r proc [-v] files..." << std::endl;
+ std::cout << "Supported routines:" << std::endl;
+ for (const auto &p : procs)
+ std::cout << " " << p.first << std::endl;
+ std::cout << std::endl;
+}
+
+// Poor man's command-line options
+const std::string dashR("-r");
+const std::string dashV("-v");
+
+int main(int argc, char *argv[])
+{
+ if (argc < 4 || dashR != argv[1] || procs.find(argv[2]) == procs.end())
+ usage(argv[0]);
+ else {
+ FuzzProc fp = procs.find(argv[2])->second;
+ int firstFile = 3;
+ if (dashV == argv[firstFile])
+ {
+ verbose = true;
+ ++firstFile;
+ }
+ for (int i = firstFile; i < argc; ++i)
+ test_one(argv[i], fp);
+ }
+}
OpenPOWER on IntegriCloud