Author: marshall
Date: Mon Oct 23 16:19:30 2017
New Revision: 316394

URL: http://llvm.org/viewvc/llvm-project?rev=316394&view=rev
Log:
More fuzzing interfaces

Added:
    libcxx/trunk/fuzzing/RoutineNames.txt
Modified:
    libcxx/trunk/fuzzing/fuzzing.cpp
    libcxx/trunk/fuzzing/fuzzing.h

Added: libcxx/trunk/fuzzing/RoutineNames.txt
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/fuzzing/RoutineNames.txt?rev=316394&view=auto
==============================================================================
--- libcxx/trunk/fuzzing/RoutineNames.txt (added)
+++ libcxx/trunk/fuzzing/RoutineNames.txt Mon Oct 23 16:19:30 2017
@@ -0,0 +1,16 @@
+sort
+stable_sort
+partition
+stable_partition
+nth_element
+partial_sort
+make_heap
+push_heap
+pop_heap
+regex_ECMAScript
+regex_POSIX
+regex_extended
+regex_awk
+regex_grep
+regex_egrep
+search

Modified: libcxx/trunk/fuzzing/fuzzing.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/fuzzing/fuzzing.cpp?rev=316394&r1=316393&r2=316394&view=diff
==============================================================================
--- libcxx/trunk/fuzzing/fuzzing.cpp (original)
+++ libcxx/trunk/fuzzing/fuzzing.cpp Mon Oct 23 16:19:30 2017
@@ -26,9 +26,12 @@
 #include "fuzzing.h"
 #include <vector>
 #include <algorithm>
+#include <functional>
 #include <regex>
 
-//     If we had C++14, we could use the four iterator version of 
is_permutation
+#include <iostream>
+
+//     If we had C++14, we could use the four iterator version of 
is_permutation and equal
 
 namespace fuzzing {
 
@@ -273,4 +276,101 @@ int regex_egrep (const uint8_t *data, si
        return 0;
 }
 
+// --  heap fuzzers
+int make_heap (const uint8_t *data, size_t size)
+{
+       std::vector<uint8_t> working(data, data + size);
+       std::make_heap(working.begin(), working.end());
+
+       if (!std::is_heap(working.begin(), working.end())) return 1;
+       if (!std::is_permutation(data, data + size, working.begin())) return 99;
+       return 0;
+}
+
+int push_heap (const uint8_t *data, size_t size)
+{
+       if (size < 2) return 0;
+
+//     Make a heap from the first half of the data
+       std::vector<uint8_t> working(data, data + size);
+       auto iter = working.begin() + (size / 2);
+       std::make_heap(working.begin(), iter);
+       if (!std::is_heap(working.begin(), iter)) return 1;
+
+//     Now push the rest onto the heap, one at a time
+       ++iter;
+       for (; iter != working.end(); ++iter) {
+               std::push_heap(working.begin(), iter);
+               if (!std::is_heap(working.begin(), iter)) return 2;     
+               }
+
+       if (!std::is_permutation(data, data + size, working.begin())) return 99;
+       return 0;
+}
+
+int pop_heap (const uint8_t *data, size_t size)
+{
+       if (size < 2) return 0;
+       std::vector<uint8_t> working(data, data + size);
+       std::make_heap(working.begin(), working.end());
+
+//     Pop things off, one at a time
+       auto iter = --working.end();
+       while (iter != working.begin()) {
+               std::pop_heap(working.begin(), iter);
+               if (!std::is_heap(working.begin(), --iter)) return 2;   
+               }
+
+       return 0;
+}
+
+
+// --  search fuzzers
+int search (const uint8_t *data, size_t size)
+{
+       if (size < 2) return 0;
+       
+       const size_t pat_size = data[0] * (size - 1) / 
std::numeric_limits<uint8_t>::max();
+       assert(pat_size <= size - 1);
+       const uint8_t *pat_begin = data + 1;
+       const uint8_t *pat_end   = pat_begin + pat_size;
+       const uint8_t *data_end  = data + size;
+       assert(pat_end <= data_end);
+//     std::cerr << "data[0] = " << size_t(data[0]) << " ";
+//     std::cerr << "Pattern size = " << pat_size << "; corpus is " << size - 
1 << std::endl;
+       auto it = std::search(pat_end, data_end, pat_begin, pat_end);
+       if (it != data_end) // not found
+               if (!std::equal(pat_begin, pat_end, it))
+                       return 1;
+       return 0;
+}
+
+template <typename S>
+static int search_helper (const uint8_t *data, size_t size)
+{
+       if (size < 2) return 0;
+       
+       const size_t pat_size = data[0] * (size - 1) / 
std::numeric_limits<uint8_t>::max();
+       const uint8_t *pat_begin = data + 1;
+       const uint8_t *pat_end   = pat_begin + pat_size;
+       const uint8_t *data_end  = data + size;
+
+       auto it = std::search(pat_end, data_end, S(pat_begin, pat_end));
+       if (it != data_end) // not found
+               if (!std::equal(pat_begin, pat_end, it))
+                       return 1;
+       return 0;
+}
+
+//     These are still in std::experimental
+// int search_boyer_moore (const uint8_t *data, size_t size)
+// {
+//     return search_helper<std::boyer_moore_searcher<const uint8_t *>>(data, 
size);
+// }
+// 
+// int search_boyer_moore_horspool (const uint8_t *data, size_t size)
+// {
+//     return search_helper<std::boyer_moore_horspool_searcher<const uint8_t 
*>>(data, size);
+// }
+
 } // namespace fuzzing

Modified: libcxx/trunk/fuzzing/fuzzing.h
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/fuzzing/fuzzing.h?rev=316394&r1=316393&r2=316394&view=diff
==============================================================================
--- libcxx/trunk/fuzzing/fuzzing.h (original)
+++ libcxx/trunk/fuzzing/fuzzing.h Mon Oct 23 16:19:30 2017
@@ -16,25 +16,34 @@
 
 namespace fuzzing {
 
-//     These all return 0 on success; != 0 on failure
-       int sort             (const uint8_t *data, size_t size);
-       int stable_sort      (const uint8_t *data, size_t size);
-       int partition        (const uint8_t *data, size_t size);
-       int stable_partition (const uint8_t *data, size_t size);
-
-//     partition and stable_partition take Bi-Di iterators.
-//     Should test those, too
-
-       int nth_element      (const uint8_t *data, size_t size);
-       int partial_sort     (const uint8_t *data, size_t size);
-
-//     Various flavors of regex
-       int regex_ECMAScript (const uint8_t *data, size_t size);
-       int regex_POSIX      (const uint8_t *data, size_t size);
-       int regex_extended   (const uint8_t *data, size_t size);
-       int regex_awk        (const uint8_t *data, size_t size);
-       int regex_grep       (const uint8_t *data, size_t size);
-       int regex_egrep      (const uint8_t *data, size_t size);
+//  These all return 0 on success; != 0 on failure
+    int sort             (const uint8_t *data, size_t size);
+    int stable_sort      (const uint8_t *data, size_t size);
+    int partition        (const uint8_t *data, size_t size);
+    int stable_partition (const uint8_t *data, size_t size);
+
+//  partition and stable_partition take Bi-Di iterators.
+//  Should test those, too
+    int nth_element      (const uint8_t *data, size_t size);
+    int partial_sort     (const uint8_t *data, size_t size);
+
+//  Heap operations
+    int make_heap        (const uint8_t *data, size_t size);
+    int push_heap        (const uint8_t *data, size_t size);
+    int pop_heap         (const uint8_t *data, size_t size);
+
+//  Various flavors of regex
+    int regex_ECMAScript (const uint8_t *data, size_t size);
+    int regex_POSIX      (const uint8_t *data, size_t size);
+    int regex_extended   (const uint8_t *data, size_t size);
+    int regex_awk        (const uint8_t *data, size_t size);
+    int regex_grep       (const uint8_t *data, size_t size);
+    int regex_egrep      (const uint8_t *data, size_t size);
+
+//     Searching
+       int search                      (const uint8_t *data, size_t size);
+//     int search_boyer_moore          (const uint8_t *data, size_t size);
+//     int search_boyer_moore_horspool (const uint8_t *data, size_t size);
 
 } // namespace fuzzing
 


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to