aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid CARLIER <devnexen@gmail.com>2023-02-13 23:00:15 +0000
committerDavid CARLIER <devnexen@gmail.com>2023-02-13 23:00:15 +0000
commit8bc3fa1df286aac46a0a724f64e2e07010d2497e (patch)
treef28e1eaa8ce45c27b413a22cc6ed54aea339f5ae
parent6030df2f563c8c5bf482217478375a6b7ea3b15a (diff)
downloadafl++-8bc3fa1df286aac46a0a724f64e2e07010d2497e.tar.gz
LLVM cmplog factoring custom Instruction iterator with added restriction
-rw-r--r--instrumentation/afl-llvm-common.cc18
-rw-r--r--instrumentation/afl-llvm-common.h2
-rw-r--r--instrumentation/cmplog-instructions-pass.cc15
-rw-r--r--instrumentation/cmplog-switches-pass.cc15
4 files changed, 20 insertions, 30 deletions
diff --git a/instrumentation/afl-llvm-common.cc b/instrumentation/afl-llvm-common.cc
index dc34d191..b50269fe 100644
--- a/instrumentation/afl-llvm-common.cc
+++ b/instrumentation/afl-llvm-common.cc
@@ -582,6 +582,24 @@ bool isInInstrumentList(llvm::Function *F, std::string Filename) {
}
+template <class Iterator>
+Iterator Unique(Iterator first, Iterator last) {
+ static_assert(std::is_trivially_copyable<
+ typename std::iterator_traits<Iterator>
+ >::value_type, "Invalid underlying type");
+
+ while (first != last) {
+
+ Iterator next(first);
+ last = std::remove(++next, last, *first);
+ first = next;
+
+ }
+
+ return last;
+
+}
+
// Calculate the number of average collisions that would occur if all
// location IDs would be assigned randomly (like normal afl/afl++).
// This uses the "balls in bins" algorithm.
diff --git a/instrumentation/afl-llvm-common.h b/instrumentation/afl-llvm-common.h
index 0112c325..8b8dc756 100644
--- a/instrumentation/afl-llvm-common.h
+++ b/instrumentation/afl-llvm-common.h
@@ -9,6 +9,7 @@
#include <string>
#include <fstream>
#include <optional>
+#include <type_traits>
#include <sys/time.h>
#include "llvm/Config/llvm-config.h"
@@ -53,6 +54,7 @@ void initInstrumentList();
bool isInInstrumentList(llvm::Function *F, std::string Filename);
unsigned long long int calculateCollisions(uint32_t edges);
void scanForDangerousFunctions(llvm::Module *M);
+template<class Iterator> Iterator Unique(Iterator, Iterator);
#ifndef IS_EXTERN
#define IS_EXTERN
diff --git a/instrumentation/cmplog-instructions-pass.cc b/instrumentation/cmplog-instructions-pass.cc
index bca1f927..c6fd7c56 100644
--- a/instrumentation/cmplog-instructions-pass.cc
+++ b/instrumentation/cmplog-instructions-pass.cc
@@ -138,21 +138,6 @@ llvmGetPassPluginInfo() {
char CmpLogInstructions::ID = 0;
#endif
-template <class Iterator>
-Iterator Unique(Iterator first, Iterator last) {
-
- while (first != last) {
-
- Iterator next(first);
- last = std::remove(++next, last, *first);
- first = next;
-
- }
-
- return last;
-
-}
-
bool CmpLogInstructions::hookInstrs(Module &M) {
std::vector<Instruction *> icomps;
diff --git a/instrumentation/cmplog-switches-pass.cc b/instrumentation/cmplog-switches-pass.cc
index cd0ae76d..f4a9fbd7 100644
--- a/instrumentation/cmplog-switches-pass.cc
+++ b/instrumentation/cmplog-switches-pass.cc
@@ -131,21 +131,6 @@ llvmGetPassPluginInfo() {
char CmplogSwitches::ID = 0;
#endif
-template <class Iterator>
-Iterator Unique(Iterator first, Iterator last) {
-
- while (first != last) {
-
- Iterator next(first);
- last = std::remove(++next, last, *first);
- first = next;
-
- }
-
- return last;
-
-}
-
bool CmplogSwitches::hookInstrs(Module &M) {
std::vector<SwitchInst *> switches;