#!/bin/bash
# #4 修正:concolic 生成没问题(pure_concolic 包装失败)。改为在【AFL 语料】上跑 SymCC 求解
# (= hybrid:AFL 探索→SymCC 解 magic 字节),数 afl-only vs afl+symcc 的 listed bug。
set -u
cd /home/ubuntu/code/symcc
OUT=/tmp/lavafix; rm -rf "$OUT"; mkdir -p "$OUT"
COUNT=/home/ubuntu/code/symcc/scratch_lava_bugcount.py
declare -A ARGS=( [base64]="-d" [uniq]="" [md5sum]="-c" )
SAMPLE=400   # 每程序对 AFL 语料抽样跑 SymCC(控制时长)

for prog in base64 uniq md5sum; do
  A=${ARGS[$prog]}
  SYMB=$(realpath benchmark/public/bin/lava-m/$prog)
  AC=/tmp/lavabugs/${prog}_afl_corpus
  [ -d "$AC" ] || { echo "[$prog] 无 afl 语料,跳过"; continue; }
  nafl=$(ls "$AC" 2>/dev/null | wc -l)
  SO="$OUT/${prog}_symcc"; mkdir -p "$SO"
  echo "========== $prog (afl 语料 $nafl 个,SymCC 抽样 $SAMPLE) =========="
  i=0
  for f in $(ls "$AC" | head -$SAMPLE); do
    SYMCC_OUTPUT_DIR="$SO" SYMCC_INPUT_FILE="$AC/$f" SYMCC_ENABLE_LINEARIZATION=1 \
      timeout -k 2 15 "$SYMB" $A "$AC/$f" >/dev/null 2>&1
    i=$((i+1))
  done
  nsym=$(ls "$SO" 2>/dev/null | wc -l)
  # hybrid 语料 = afl 语料 + symcc 输出
  HY="$OUT/${prog}_hybrid"; mkdir -p "$HY"
  cp "$AC"/* "$HY"/ 2>/dev/null; cp "$SO"/* "$HY"/ 2>/dev/null
  echo "  SymCC 在 afl 语料上生成 $nsym 个新输入;hybrid 合并语料 $(ls "$HY"|wc -l) 个"
  echo "  --- afl-only bug 数 ---"
  python3 "$COUNT" "$prog" "$AC" 2>&1 | grep -aE "触发的不同|命中 listed"
  echo "  --- hybrid(afl+symcc) bug 数 ---"
  python3 "$COUNT" "$prog" "$HY" 2>&1 | grep -aE "触发的不同|命中 listed"
done
echo "LAVAFIX_DONE"
