add floating point test cases. One for fuzzing (test-floatingpoint.c) and one for testing all cases with the instrumented program (test-fp_cases.c)
ADD
test/test-floatingpoint.c
+#include <stdlib.h>
+#include <unistd.h>
+
+int main(void)
+{
+ long double magic;
+
+ ssize_t bytes_read = read(STDIN_FILENO, &magic, sizeof(magic));
+ if (bytes_read < (ssize_t)sizeof(magic)) {
+ return 1;
+ }
+
+ if( (-magic == 15.0 + 0.5 + 0.125 + 0.03125 + 0.0078125) ){ /* 15 + 1/2 + 1/8 + 1/32 + 1/128 */
+ abort();
+ }
+
+ return 0;
+}

ADD
test/test-fp_cases.c
+/* test cases for floating point comparison transformations
+ * compile with -DFLOAT_TYPE=float
+ * or -DFLOAT_TYPE=double
+ * or -DFLOAT_TYPE="long double"
+ */
+
+
+#include <assert.h>
+
+int main() {
+ volatile FLOAT_TYPE a,b;
+ /* different values */
+ a = -2.1; b = -2; /* signs equal, exp equal, mantissa > */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 1.8; b = 2.1; /* signs equal, exp differ, mantissa > */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 2; b = 2.1; /* signs equal, exp equal, mantissa < */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -2; b = -1.8; /* signs equal, exp differ, mantissa < */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -1; b = 1; /* signs differ, exp equal, mantissa equal */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -1; b = 0; /* signs differ, exp differ, mantissa equal */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -2; b = 2.8; /* signs differ, exp equal, mantissa < */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -2; b = 1.8; /* signs differ, exp differ, mantissa < */
+ assert((a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert(!(a >= b));
+ assert((a != b));
+ assert(!(a == b));
+
+
+ a = -2; b = -2.1; /* signs equal, exp equal, mantissa > */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 2.1; b = 1.8; /* signs equal, exp differ, mantissa > */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 2.1; b = 2; /* signs equal, exp equal, mantissa < */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = -1.8; b = -2; /* signs equal, exp differ, mantissa < */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 1; b = -1; /* signs differ, exp equal, mantissa equal */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 0; b = -1; /* signs differ, exp differ, mantissa equal */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 2.8; b = -2; /* signs differ, exp equal, mantissa < */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ a = 1.8; b = -2; /* signs differ, exp differ, mantissa < */
+ assert((a > b));
+ assert((a >= b));
+ assert(!(a < b));
+ assert(!(a <= b));
+ assert((a != b));
+ assert(!(a == b));
+
+ /* equal values */
+ a = 0; b = 0;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+
+ a = -0; b = 0;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+
+ a = 1; b = 1;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+
+ a = 0.5; b = 0.5;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+
+ a = -1; b = -1;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+
+ a = -0.5; b = -0.5;
+ assert(!(a < b));
+ assert((a <= b));
+ assert(!(a > b));
+ assert((a >= b));
+ assert(!(a != b));
+ assert((a == b));
+}

MODIFY
test/test.sh
test/test.sh
@@ -372,8 +372,7 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
$ECHO "$YELLOW[-] llvm_mode InsTrim not compiled, cannot test"
INCOMPLETE=1
}
- AFL_LLVM_INSTRUMENT=AFL
- AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_SWITCHES=1 AFL_LLVM_LAF_TRANSFORM_COMPARES=1 AFL_LLVM_LAF_SPLIT_COMPARES=1 ../afl-clang-fast -o test-compcov.compcov test-compcov.c > test.out 2>&1
+ AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_SWITCHES=1 AFL_LLVM_LAF_TRANSFORM_COMPARES=1 AFL_LLVM_LAF_SPLIT_COMPARES=1 ../afl-clang-fast -o test-compcov.compcov test-compcov.c > test.out 2>&1
test -e test-compcov.compcov && test_compcov_binary_functionality ./test-compcov.compcov && {
grep --binary-files=text -Eq " [ 123][0-9][0-9] location| [3-9][0-9] location" test.out && {
$ECHO "$GREEN[+] llvm_mode laf-intel/compcov feature works correctly"
@@ -386,6 +385,25 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
CODE=1
}
rm -f test-compcov.compcov test.out
+ AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES=1 AFL_LLVM_LAF_SPLIT_FLOATS=1 ../afl-clang-fast -o test-floatingpoint test-floatingpoint.c > test.out 2>&1
+ test -e test-floatingpoint && {
+ mkdir -p in
+ echo 0 > in/in
+ $ECHO "$GREY[*] running afl-fuzz with floating point splitting, this will take max. 16 seconds"
+ {
+ AFL_BENCH_UNTIL_CRASH=1 ../afl-fuzz -V16 -m ${MEM_LIMIT} -i in -o out -- ./test-floatingpoint >>errors 2>&1
+ } >>errors 2>&1
+ test -n "$( ls out/queue/id:000002* 2>/dev/null )" && {
+ $ECHO "$GREEN[+] llvm_mode laf-intel floatingpoint splitting feature works correctly"
+ } || {
+ $ECHO "$RED[!] llvm_mode laf-intel floatingpoint splitting feature failed"
+ CODE=1
+ }
+ } || {
+ $ECHO "$RED[!] llvm_mode laf-intel floatingpoint splitting feature compilation failed"
+ CODE=1
+ }
+ rm -f test-floatingpoint test.out in/in
echo foobar.c > instrumentlist.txt
AFL_DEBUG=1 AFL_LLVM_INSTRUMENT_FILE=instrumentlist.txt ../afl-clang-fast -o test-compcov test-compcov.c > test.out 2>&1
test -e test-compcov && test_compcov_binary_functionality ./test-compcov && {

add floating point test cases. One for fuzzing (test-floatingpoint.c) and one for testing all cases with the instrumented program (test-fp_cases.c)