1*08b48e0bSAndroid Build Coastguard Worker#!/bin/sh 2*08b48e0bSAndroid Build Coastguard Worker 3*08b48e0bSAndroid Build Coastguard Worker# All tests should start with sourcing test-pre.sh and finish with sourcing test-post.sh 4*08b48e0bSAndroid Build Coastguard Worker# They may set an error code with $CODE=1 5*08b48e0bSAndroid Build Coastguard Worker# If tests are incomplete, they may set $INCOMPLETE=1 6*08b48e0bSAndroid Build Coastguard Worker 7*08b48e0bSAndroid Build Coastguard WorkerAFL_TEST_COUNT=$((AFL_TEST_COUNT+1)) 8*08b48e0bSAndroid Build Coastguard WorkerAFL_TEST_DEPTH=$((AFL_TEST_DEPTH+1)) 9*08b48e0bSAndroid Build Coastguard Worker 10*08b48e0bSAndroid Build Coastguard Workerif [ $AFL_TEST_DEPTH = 1 ]; then 11*08b48e0bSAndroid Build Coastguard Worker# First run :) 12*08b48e0bSAndroid Build Coastguard Worker 13*08b48e0bSAndroid Build Coastguard Worker# 14*08b48e0bSAndroid Build Coastguard Worker# Ensure we have: test, type, diff, grep -qE 15*08b48e0bSAndroid Build Coastguard Worker# 16*08b48e0bSAndroid Build Coastguard Workertest -z "" 2>/dev/null || { echo Error: test command not found ; exit 1 ; } 17*08b48e0bSAndroid Build Coastguard WorkerGREP=`type grep > /dev/null 2>&1 && echo OK` 18*08b48e0bSAndroid Build Coastguard Workertest "$GREP" = OK || { echo Error: grep command not found ; exit 1 ; } 19*08b48e0bSAndroid Build Coastguard Workerecho foobar | grep -qE 'asd|oob' 2>/dev/null || { echo Error: grep command does not support -q and/or -E option ; exit 1 ; } 20*08b48e0bSAndroid Build Coastguard Workertest -e ./test-all.sh || cd $(dirname $0) || exit 1 21*08b48e0bSAndroid Build Coastguard Workertest -e ./test-all.sh || { echo Error: you must be in the test/ directory ; exit 1 ; } 22*08b48e0bSAndroid Build Coastguard Workerexport AFL_PATH=`pwd`/.. 23*08b48e0bSAndroid Build Coastguard Workerexport AFL_TRY_AFFINITY=1 # workaround for travis that fails for no avail cores 24*08b48e0bSAndroid Build Coastguard Worker 25*08b48e0bSAndroid Build Coastguard Workerecho 1 > test.1 26*08b48e0bSAndroid Build Coastguard Workerecho 1 > test.2 27*08b48e0bSAndroid Build Coastguard WorkerOK=OK 28*08b48e0bSAndroid Build Coastguard Workerdiff test.1 test.2 >/dev/null 2>&1 || OK= 29*08b48e0bSAndroid Build Coastguard Workerrm -f test.1 test.2 30*08b48e0bSAndroid Build Coastguard Workertest -z "$OK" && { echo Error: diff is not working ; exit 1 ; } 31*08b48e0bSAndroid Build Coastguard Workertest -z "$LLVM_CONFIG" && LLVM_CONFIG=llvm-config 32*08b48e0bSAndroid Build Coastguard Worker 33*08b48e0bSAndroid Build Coastguard Worker# check for '-a' option of grep 34*08b48e0bSAndroid Build Coastguard Workerif grep -a test test-all.sh >/dev/null 2>&1; then 35*08b48e0bSAndroid Build Coastguard Worker GREPAOPTION=' -a' 36*08b48e0bSAndroid Build Coastguard Workerelse 37*08b48e0bSAndroid Build Coastguard Worker GREPAOPTION= 38*08b48e0bSAndroid Build Coastguard Workerfi 39*08b48e0bSAndroid Build Coastguard Worker 40*08b48e0bSAndroid Build Coastguard Workertest_compcov_binary_functionality() { 41*08b48e0bSAndroid Build Coastguard Worker RUN="../afl-showmap -m ${MEM_LIMIT} -o /dev/null -- $1" 42*08b48e0bSAndroid Build Coastguard Worker $RUN 'LIBTOKENCAP' | grep 'your string was LIBTOKENCAP' \ 43*08b48e0bSAndroid Build Coastguard Worker && $RUN 'BUGMENOT' | grep 'your string was BUGMENOT' \ 44*08b48e0bSAndroid Build Coastguard Worker && $RUN 'BANANA' | grep 'your string started with BAN' \ 45*08b48e0bSAndroid Build Coastguard Worker && $RUN 'APRI' | grep 'your string was APRI' \ 46*08b48e0bSAndroid Build Coastguard Worker && $RUN 'kiWI' | grep 'your string was Kiwi' \ 47*08b48e0bSAndroid Build Coastguard Worker && $RUN 'Avocado' | grep 'your string was avocado' \ 48*08b48e0bSAndroid Build Coastguard Worker && $RUN 'GRAX' 3 | grep 'your string was a prefix of Grapes' \ 49*08b48e0bSAndroid Build Coastguard Worker && $RUN 'LOCALVARIABLE' | grep 'local var memcmp works!' \ 50*08b48e0bSAndroid Build Coastguard Worker && $RUN 'abc' | grep 'short local var memcmp works!' \ 51*08b48e0bSAndroid Build Coastguard Worker && $RUN 'GLOBALVARIABLE' | grep 'global var memcmp works!' 52*08b48e0bSAndroid Build Coastguard Worker} > /dev/null 53*08b48e0bSAndroid Build Coastguard Worker 54*08b48e0bSAndroid Build Coastguard WorkerECHO="printf %b\\n" 55*08b48e0bSAndroid Build Coastguard Worker$ECHO \\101 2>&1 | grep -qE '^A' || { 56*08b48e0bSAndroid Build Coastguard Worker ECHO= 57*08b48e0bSAndroid Build Coastguard Worker test -e /bin/printf && { 58*08b48e0bSAndroid Build Coastguard Worker ECHO="/bin/printf %b\\n" 59*08b48e0bSAndroid Build Coastguard Worker $ECHO "\\101" 2>&1 | grep -qE '^A' || ECHO= 60*08b48e0bSAndroid Build Coastguard Worker } 61*08b48e0bSAndroid Build Coastguard Worker} 62*08b48e0bSAndroid Build Coastguard Workertest -z "$ECHO" && { printf Error: printf command does not support octal character codes ; exit 1 ; } 63*08b48e0bSAndroid Build Coastguard Worker 64*08b48e0bSAndroid Build Coastguard Workerexport AFL_EXIT_WHEN_DONE=1 65*08b48e0bSAndroid Build Coastguard Workerexport AFL_EXIT_ON_TIME=60 66*08b48e0bSAndroid Build Coastguard Workerexport AFL_SKIP_CPUFREQ=1 67*08b48e0bSAndroid Build Coastguard Workerexport AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 68*08b48e0bSAndroid Build Coastguard Workerunset AFL_NO_X86 69*08b48e0bSAndroid Build Coastguard Workerunset AFL_QUIET 70*08b48e0bSAndroid Build Coastguard Workerunset AFL_DEBUG 71*08b48e0bSAndroid Build Coastguard Workerunset AFL_HARDEN 72*08b48e0bSAndroid Build Coastguard Workerunset AFL_USE_ASAN 73*08b48e0bSAndroid Build Coastguard Workerunset AFL_USE_MSAN 74*08b48e0bSAndroid Build Coastguard Workerunset AFL_USE_UBSAN 75*08b48e0bSAndroid Build Coastguard Workerunset AFL_USE_LSAN 76*08b48e0bSAndroid Build Coastguard Workerunset AFL_TMPDIR 77*08b48e0bSAndroid Build Coastguard Workerunset AFL_CC 78*08b48e0bSAndroid Build Coastguard Workerunset AFL_PRELOAD 79*08b48e0bSAndroid Build Coastguard Workerunset AFL_GCC_INSTRUMENT_FILE 80*08b48e0bSAndroid Build Coastguard Workerunset AFL_LLVM_INSTRUMENT_FILE 81*08b48e0bSAndroid Build Coastguard Workerunset AFL_LLVM_INSTRIM 82*08b48e0bSAndroid Build Coastguard Workerunset AFL_LLVM_LAF_SPLIT_SWITCHES 83*08b48e0bSAndroid Build Coastguard Workerunset AFL_LLVM_LAF_TRANSFORM_COMPARES 84*08b48e0bSAndroid Build Coastguard Workerunset AFL_LLVM_LAF_SPLIT_COMPARES 85*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_ADDR 86*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_RETADDR_OFFSET 87*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_GPR 88*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_RET 89*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_HOOK 90*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_CNT 91*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_MEM 92*08b48e0bSAndroid Build Coastguard Workerunset AFL_QEMU_PERSISTENT_EXITS 93*08b48e0bSAndroid Build Coastguard Workerunset AFL_CUSTOM_MUTATOR_LIBRARY 94*08b48e0bSAndroid Build Coastguard Workerunset AFL_PYTHON_MODULE 95*08b48e0bSAndroid Build Coastguard Workerunset AFL_PRELOAD 96*08b48e0bSAndroid Build Coastguard Workerunset LD_PRELOAD 97*08b48e0bSAndroid Build Coastguard Workerunset SKIP 98*08b48e0bSAndroid Build Coastguard Worker 99*08b48e0bSAndroid Build Coastguard Workerrm -rf in in2 out 100*08b48e0bSAndroid Build Coastguard Worker 101*08b48e0bSAndroid Build Coastguard Workertest -z "$TRAVIS_OS_NAME" && { 102*08b48e0bSAndroid Build Coastguard Worker export ASAN_OPTIONS=detect_leaks=0:allocator_may_return_null=1:abort_on_error=1:symbolize=0 103*08b48e0bSAndroid Build Coastguard Worker} 104*08b48e0bSAndroid Build Coastguard Workertest -n "$TRAVIS_OS_NAME" && { 105*08b48e0bSAndroid Build Coastguard Worker export ASAN_OPTIONS=detect_leaks=0:allocator_may_return_null=1:abort_on_error=1:symbolize=1 106*08b48e0bSAndroid Build Coastguard Worker} 107*08b48e0bSAndroid Build Coastguard Worker 108*08b48e0bSAndroid Build Coastguard Worker#export AFL_LLVM_INSTRUMENT=AFL # AFL mode makes dlopen not link on macos 109*08b48e0bSAndroid Build Coastguard Worker 110*08b48e0bSAndroid Build Coastguard Worker# on OpenBSD we need to work with llvm from /usr/local/bin 111*08b48e0bSAndroid Build Coastguard Workertest -e /usr/local/bin/opt && { 112*08b48e0bSAndroid Build Coastguard Worker test `uname -s` = 'Darwin' || export PATH="/usr/local/bin:${PATH}" 113*08b48e0bSAndroid Build Coastguard Worker} 114*08b48e0bSAndroid Build Coastguard Worker# on MacOS X we prefer afl-clang over afl-gcc, because 115*08b48e0bSAndroid Build Coastguard Worker# afl-gcc does not work there (it is a symlink from clang) 116*08b48e0bSAndroid Build Coastguard Workertest `uname -s` = 'Darwin' -o `uname -s` = 'FreeBSD' && { 117*08b48e0bSAndroid Build Coastguard Worker AFL_GCC=afl-clang 118*08b48e0bSAndroid Build Coastguard Worker} || { 119*08b48e0bSAndroid Build Coastguard Worker AFL_GCC=afl-gcc 120*08b48e0bSAndroid Build Coastguard Worker} 121*08b48e0bSAndroid Build Coastguard Workercommand -v gcc >/dev/null 2>&1 || AFL_GCC=afl-clang 122*08b48e0bSAndroid Build Coastguard Worker 123*08b48e0bSAndroid Build Coastguard WorkerSYS=`uname -m` 124*08b48e0bSAndroid Build Coastguard Worker 125*08b48e0bSAndroid Build Coastguard WorkerGREY="\\033[1;90m" 126*08b48e0bSAndroid Build Coastguard WorkerBLUE="\\033[1;94m" 127*08b48e0bSAndroid Build Coastguard WorkerGREEN="\\033[0;32m" 128*08b48e0bSAndroid Build Coastguard WorkerRED="\\033[0;31m" 129*08b48e0bSAndroid Build Coastguard WorkerYELLOW="\\033[1;93m" 130*08b48e0bSAndroid Build Coastguard WorkerRESET="\\033[0m" 131*08b48e0bSAndroid Build Coastguard Worker 132*08b48e0bSAndroid Build Coastguard WorkerMEM_LIMIT=none 133*08b48e0bSAndroid Build Coastguard Worker 134*08b48e0bSAndroid Build Coastguard Workerexport PATH="${PATH}:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" 135*08b48e0bSAndroid Build Coastguard Worker 136*08b48e0bSAndroid Build Coastguard Worker$ECHO "${RESET}${GREY}[*] starting AFL++ test framework ..." 137*08b48e0bSAndroid Build Coastguard Worker 138*08b48e0bSAndroid Build Coastguard Workertest -z "$SYS" && $ECHO "$YELLOW[-] uname -m did not succeed" 139*08b48e0bSAndroid Build Coastguard Worker 140*08b48e0bSAndroid Build Coastguard WorkerCODE=0 141*08b48e0bSAndroid Build Coastguard WorkerINCOMPLETE=0 142*08b48e0bSAndroid Build Coastguard Worker 143*08b48e0bSAndroid Build Coastguard Workerfi 144