about summary refs log tree commit diff
path: root/test
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2021-12-13 22:58:19 +0100
committerGitHub <noreply@github.com>2021-12-13 22:58:19 +0100
commit22e2362f0fd5685548696f487639104a0059e3eb (patch)
treef59a3c6d5fb0f42056252f400f3bab1e1010432b /test
parent08ca4d54a55fe73e64a994c41a12af61f52e497e (diff)
parentc6bad07d75aa36671ebc32a722566cb145414b08 (diff)
downloadafl++-22e2362f0fd5685548696f487639104a0059e3eb.tar.gz
Merge pull request #1213 from AFLplusplus/dev
push to stable
Diffstat (limited to 'test')
-rw-r--r--test/test-cmplog.c17
-rwxr-xr-xtest/test-fpExtra.sh39
-rw-r--r--test/test-fp_Infcases.c124
-rw-r--r--test/test-fp_NaNcases.c86
-rw-r--r--test/test-fp_minusZerocases.c35
-rwxr-xr-xtest/test-llvm-lto.sh2
6 files changed, 298 insertions, 5 deletions
diff --git a/test/test-cmplog.c b/test/test-cmplog.c
index 262df6bd..1a314653 100644
--- a/test/test-cmplog.c
+++ b/test/test-cmplog.c
@@ -7,6 +7,7 @@
 #include <unistd.h>
 
 int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t i) {
+
   if (i < 24) return 0;
   if (buf[0] != 'A') return 0;
   if (buf[1] != 'B') return 0;
@@ -16,17 +17,25 @@ int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t i) {
   if (strncmp(buf + 12, "IJKL", 4) == 0 && strcmp(buf + 16, "DEADBEEF") == 0)
     abort();
   return 0;
+
 }
 
 #ifdef __AFL_COMPILER
 int main(int argc, char *argv[]) {
-  unsigned char    buf[1024];
-  ssize_t i;
-  while(__AFL_LOOP(1000)) {
-    i = read(0, (char*)buf, sizeof(buf) - 1);
+
+  unsigned char buf[1024];
+  ssize_t       i;
+  while (__AFL_LOOP(1000)) {
+
+    i = read(0, (char *)buf, sizeof(buf) - 1);
     if (i > 0) buf[i] = 0;
     LLVMFuzzerTestOneInput(buf, i);
+
   }
+
   return 0;
+
 }
+
 #endif
+
diff --git a/test/test-fpExtra.sh b/test/test-fpExtra.sh
new file mode 100755
index 00000000..aecc6258
--- /dev/null
+++ b/test/test-fpExtra.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+. ./test-pre.sh
+
+test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
+  $ECHO "$GREY[*] llvm_mode laf-intel/compcov testing splitting floating point types with Nan, infinity, minusZero"
+  for testcase in ./test-fp_minusZerocases.c ./test-fp_Infcases.c ./test-fp_NaNcases.c; do
+  #for testcase in ./test-fp_cases.c ./test-fp_Infcases.c ./test-fp_NaNcases.c ./test-fp_minusZerocases.c ; do
+    for I in float double "long double"; do
+    #for I in double; do
+      for BITS in 64 32 16 8; do
+      #for BITS in 64; do
+        bin="$testcase-split-$I-$BITS.compcov" 
+#AFL_DONT_OPTIMIZE=1 AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES_BITW=$BITS AFL_LLVM_LAF_SPLIT_COMPARES=1 AFL_LLVM_LAF_SPLIT_FLOATS=1 ../afl-clang-fast -DFLOAT_TYPE="$I" -S "$testcase"
+#AFL_DONT_OPTIMIZE=1 AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES_BITW=$BITS AFL_LLVM_LAF_SPLIT_COMPARES=1 AFL_LLVM_LAF_SPLIT_FLOATS=1 ../afl-clang-fast -DFLOAT_TYPE="$I" -S -emit-llvm "$testcase"
+AFL_DONT_OPTIMIZE=1 AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES_BITW=$BITS AFL_LLVM_LAF_SPLIT_COMPARES=1 AFL_LLVM_LAF_SPLIT_FLOATS=1 ../afl-clang-fast -DFLOAT_TYPE="$I" -o "$bin" "$testcase" > test.out 2>&1;
+        if ! test -e "$bin"; then
+            cat test.out
+            $ECHO "$RED[!] llvm_mode laf-intel/compcov float splitting failed! ($testcase with type $I split to $BITS)!";
+            CODE=1
+            break
+        fi
+        if ! "$bin"; then
+            $ECHO "$RED[!] llvm_mode laf-intel/compcov float splitting resulted in miscompilation (type $I split to $BITS)!";
+            CODE=1
+            break
+        fi
+        rm -f "$bin" test.out || true
+      done
+    done
+  done
+  rm -f test-fp_cases*.compcov test.out
+
+} || {
+  $ECHO "$YELLOW[-] llvm_mode not compiled, cannot test"
+  INCOMPLETE=1
+}
+
+. ./test-post.sh
diff --git a/test/test-fp_Infcases.c b/test/test-fp_Infcases.c
new file mode 100644
index 00000000..458202d6
--- /dev/null
+++ b/test/test-fp_Infcases.c
@@ -0,0 +1,124 @@
+/* test cases for floating point comparison transformations
+ * compile with -DFLOAT_TYPE=float
+ *          or  -DFLOAT_TYPE=double
+ *          or  -DFLOAT_TYPE="long double"
+ */
+
+#include <assert.h>
+#define _GNU_SOURCE
+#include <math.h>                           /* for NaNs and infinity values */
+
+int main() {
+
+  volatile FLOAT_TYPE a, b;
+
+#ifdef INFINITY
+  FLOAT_TYPE inf = (FLOAT_TYPE)INFINITY;
+#else
+  FLOAT_TYPE inf = 1.0 / 0.0;                          /* produces infinity */
+#endif
+  FLOAT_TYPE negZero = 1.0 / -inf;
+  FLOAT_TYPE posZero = 0.0;
+
+  /* plus infinity */
+  a = (1.0 / 0.0);                                     /* positive infinity */
+  b = (1.0 / 0.0);                                     /* positive infinity */
+  assert(!(a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert((a >= b));
+  assert(!(a != b));
+  assert((a == b));
+
+  b = -(1.0 / 0.0);                                    /* negative infinity */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert((a > b));
+  assert((a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert((a > b));
+  assert((a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 0.0;                                                    /* positive 0 */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert((a > b));
+  assert((a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = -42.0;
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert((a > b));
+  assert((a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 42.0;
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert((a > b));
+  assert((a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  /* negative infinity */
+  a = -(1.0 / 0.0);
+  b = (1.0 / 0.0);                                     /* positive infinity */
+  assert((a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = -(1.0 / 0.0);                                    /* negative infinity */
+  assert(!(a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert((a >= b));
+  assert(!(a != b));
+  assert((a == b));
+
+  b = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  assert((a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 0.0;                                                    /* positive 0 */
+  assert((a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = -42.0;
+  assert((a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 42.0;
+  assert((a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+}
+
diff --git a/test/test-fp_NaNcases.c b/test/test-fp_NaNcases.c
new file mode 100644
index 00000000..94a0ff71
--- /dev/null
+++ b/test/test-fp_NaNcases.c
@@ -0,0 +1,86 @@
+/* test cases for floating point comparison transformations
+ * compile with -DFLOAT_TYPE=float
+ *          or  -DFLOAT_TYPE=double
+ *          or  -DFLOAT_TYPE="long double"
+ */
+
+#include <assert.h>
+#define _GNU_SOURCE
+#include <math.h>                           /* for NaNs and infinity values */
+
+int main() {
+
+  volatile FLOAT_TYPE a, b;
+
+  /* NaN */
+#ifdef NAN
+  a = (FLOAT_TYPE)NAN;                                      /* produces NaN */
+#else
+  a = 0.0 / 0.0;                                            /* produces NaN */
+#endif
+#ifdef INFINITY
+  FLOAT_TYPE inf = (FLOAT_TYPE)INFINITY;
+#else
+  FLOAT_TYPE inf = 1.0 / 0.0;                          /* produces infinity */
+#endif
+  FLOAT_TYPE negZero = 1.0 / -inf;
+  FLOAT_TYPE posZero = 0.0;
+  b = a;
+
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 0.0;
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = 42.0;
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = -42.0;
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = (1.0 / 0.0);                                     /* positive infinity */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+  b = -(1.0 / 0.0);                                    /* negative infinity */
+  assert(!(a < b));
+  assert(!(a <= b));
+  assert(!(a > b));
+  assert(!(a >= b));
+  assert((a != b));
+  assert(!(a == b));
+
+}
+
diff --git a/test/test-fp_minusZerocases.c b/test/test-fp_minusZerocases.c
new file mode 100644
index 00000000..f821f2ab
--- /dev/null
+++ b/test/test-fp_minusZerocases.c
@@ -0,0 +1,35 @@
+/* test cases for floating point comparison transformations
+ * compile with -DFLOAT_TYPE=float
+ *          or  -DFLOAT_TYPE=double
+ *          or  -DFLOAT_TYPE="long double"
+ */
+
+#include <assert.h>
+#define _GNU_SOURCE
+#include <math.h>                           /* for NaNs and infinity values */
+
+int main() {
+
+  volatile FLOAT_TYPE a, b;
+
+  /* negative zero */
+  a = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  b = 0.0;                                                    /* positive 0 */
+  assert(!(a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert((a >= b));
+  assert(!(a != b));
+  assert((a == b));
+
+  a = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  b = 1.0 / -(1.0 / 0.0);                                     /* negative 0 */
+  assert(!(a < b));
+  assert((a <= b));
+  assert(!(a > b));
+  assert((a >= b));
+  assert(!(a != b));
+  assert((a == b));
+
+}
+
diff --git a/test/test-llvm-lto.sh b/test/test-llvm-lto.sh
index 3e762acf..9ff2ec10 100755
--- a/test/test-llvm-lto.sh
+++ b/test/test-llvm-lto.sh
@@ -3,7 +3,7 @@
 . ./test-pre.sh
 
 $ECHO "$BLUE[*] Testing: LTO llvm_mode"
-test -e ../afl-clang-lto -a -e ../afl-llvm-lto-instrumentation.so && {
+test -e ../afl-clang-lto -a -e ../SanitizerCoverageLTO.so && {
   # on FreeBSD need to set AFL_CC
   test `uname -s` = 'FreeBSD' && {
     if type clang >/dev/null; then