#!/bin/bash
# #2 CPU 对等 afl-only:libarchive 上 32 个并行 AFL 实例(与 hybrid np=32 同核预算),300s,
# 量 ShowmapCov + master FstatsCov,对照 hybrid np=32 的 26.95%。
set -u
cd /home/ubuntu/code/symcc
OUT=/tmp/aflonly32; rm -rf "$OUT"; mkdir -p "$OUT/afl_out"
BIN=$(realpath benchmark/public/bin/libarchive-afl/archive_fuzzer)
SEEDS=$(realpath benchmark/public/seeds/libarchive)
N=32; T=300
export AFL_NO_UI=1 AFL_SKIP_CPUFREQ=1 AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
export AFL_AUTORESUME=1 AFL_FORKSRV_INIT_TMOUT=120000 AFL_TRY_AFFINITY=1

# 清理可能的旧 afl(精确名,安全)
pkill -9 -x afl-fuzz 2>/dev/null; sleep 2

echo "launching $N AFL instances on libarchive, ${T}s..."
afl-fuzz -M fuzzer01 -i "$SEEDS" -o "$OUT/afl_out" -m none -- "$BIN" > "$OUT/f01.log" 2>&1 &
for i in $(seq 2 $N); do
  nm=$(printf "fuzzer%02d" $i)
  afl-fuzz -S "$nm" -i "$SEEDS" -o "$OUT/afl_out" -m none -- "$BIN" > "$OUT/$nm.log" 2>&1 &
done
sleep 8
echo "  alive AFL instances: $(pgrep -x afl-fuzz | wc -l)/$N"
head -3 "$OUT/f01.log" 2>/dev/null | sed 's/^/  f01: /'
sleep $((T-8))

pkill -9 -x afl-fuzz 2>/dev/null; sleep 3

# 合并所有实例 queue,超 2 万抽样(固定种子,复现)
MERGE="$OUT/merged"; mkdir -p "$MERGE"
for q in "$OUT"/afl_out/*/queue; do cp -n "$q"/id:* "$MERGE"/ 2>/dev/null; done
NM=$(ls "$MERGE" | wc -l); echo "merged corpus: $NM files"
MDIR="$MERGE"
if [ "$NM" -gt 20000 ]; then
  MDIR="$OUT/sample"; mkdir -p "$MDIR"
  ls "$MERGE" | sort | awk 'NR%(int('"$NM"'/20000)+1)==0' | head -20000 | while read f; do cp "$MERGE/$f" "$MDIR/"; done
  echo "  sampled to $(ls "$MDIR"|wc -l)"
fi

echo "=== measure ShowmapCov (afl-showmap -C over merged corpus) ==="
CWD=$(mktemp -d)
( cd "$CWD" && afl-showmap -C -i "$MDIR" -o /dev/null -m none -t 5000 -- "$BIN" ) > "$OUT/showmap.txt" 2>&1
grep -aiE "coverage of|out of|Captured" "$OUT/showmap.txt" | tail -2
rm -rf "$CWD"
echo "=== master FstatsCov ==="
grep -aE "bitmap_cvg|edges_found|execs_done" "$OUT/afl_out/fuzzer01/fuzzer_stats" 2>/dev/null
echo "=== 对照 ==="
echo "  hybrid np=32 (F@T30) ShowmapCov = 26.95% (13696 分母);  afl-only-32 见上"
echo "AFLONLY32_DONE"
