#!/bin/bash

SpecialCores=(dd dircolors echo expr mknod od pathchk printf)
GeneralCores=(base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date df dirname du env expand factor false fmt fold head hostid hostname id ginstall join kill link ln logname ls md5sum mkdir mkfifo mktemp mv nice nl nohup paste pinky pr printenv ptx pwd readlink rm rmdir runcon seq setuidgid shred shuf sleep sort split stat stty sum sync tac tail tee touch tr tsort tty uname unexpand uniq unlink uptime users wc whoami who yes)

SpecialCoresInputs=("--sym-args 0 3 10 --sym-files 1 8 --sym-stdout"
"--sym-args 0 3 10 --sym-files 2 12 --sym-stdout"
"--sym-args 0 4 300 --sym-files 2 30 --sym-stdout"
"--sym-args 0 1 10 --sym-args 0 3 2 --sym-stdout"
"--sym-args 0 1 10 --sym-args 0 3 2 --sym-files 1 8 --sym-stdout"
"--sym-args 0 3 10 --sym-files 2 12 --sym-stdout"
"--sym-args 0 1 2 --sym-args 0 1 300 --sym-files 1 8 --sym-stdout"
"--sym-args 0 3 10 --sym-files 2 12 --sym-stdout")
GeneralCoresInputs="--sym-args 0 1 10 --sym-args 0 2 2 --sym-files 1 8 --sym-stdout"


KLEE="klee \
-simplify-sym-indices \
-max-memory=1000 \
-disable-inlining \
-optimize \
-use-forked-solver \
-use-cex-cache \
-libc=uclibc \
-posix-runtime \
-allow-external-sym-calls \
-only-output-states-covering-new \
-environ=../test.env \
-max-sym-array-size=4096 \
-max-instruction-time=30. \
-max-time=30. \
-watchdog \
-max-memory-inhibit=false \
-max-static-fork-pct=1 \
-max-static-solve-pct=1 \
-max-static-cpfork-pct=1 \
-switch-type=internal \
-randomize-fork \
-search=random-path \
-search=dfs \
-use-batching-search \
-batch-instructions=10000 \
-use-query-log=all:smt2 \
-use-query-log=all:pc \
-smtlib-use-let-expressions=0 \
-write-pcs=0 \
-write-smt2s=0 \
-write-cov=0 \
-write-cvcs=0 \
-write-paths=0 \
-write-sym-paths=0 \
-write-test-info=0
"

cd sandbox
length=${!SpecialCores[*]}
for index in {0..7}
do
  item=${SpecialCores[$index]}
  input=${SpecialCoresInputs[$index]}
  cd $item
  printf "Entering $(pwd)\n"
  printf "Processing $input ... \n"
  printf "$KLEE $input \n"
  $KLEE ./$item.bc $input
  cd ..
done

for item in ${GeneralCores[*]}
do
  cd $item
  printf "Entering $(pwd)\n"
  printf "Processing $item ... \n"
  echo "$KLEE ./$item.bc $GeneralCoresInputs"
  $KLEE ./$item.bc $GeneralCoresInputs
  cd ..
done

