stop the fuzzer if AFL_QEMU_PERSISTENT_ADDR is wrong
MODIFY
qemu_mode/patches/afl-qemu-cpu-inl.h
qemu_mode/patches/afl-qemu-cpu-inl.h
@@ -273,6 +273,8 @@ static void afl_forkserver(CPUState *cpu) {
afl_forksrv_pid = getpid();
+ int first_run = 1;
+
/* All right, let's await orders... */
while (1) {
@@ -349,6 +351,8 @@ static void afl_forkserver(CPUState *cpu) {
again. */
if (WIFSTOPPED(status)) child_stopped = 1;
+ else if(unlikely(first_run)) exit(12); // Persistent is wrong
+ first_run = 0;
if (write(FORKSRV_FD + 1, &status, 4) != 4) exit(7);

MODIFY
src/afl-fuzz-run.c
src/afl-fuzz-run.c
@@ -189,7 +189,11 @@ u8 run_target(char** argv, u32 timeout) {
" - The binary, at least in some circumstances, exits in a way "
"that\n"
" also kills the parent process - raise() could be the "
- "culprit.\n\n"
+ "culprit.\n"
+ " - If using persistent mode with QEMU, AFL_QEMU_PERSISTENT_ADDR "
+ "is\n"
+ " probably not valid (hint: add the base address in case of PIE)"
+ "\n\n"
"If all else fails you can disable the fork server via "
"AFL_NO_FORKSRV=1.\n",
mem_limit);

stop the fuzzer if AFL_QEMU_PERSISTENT_ADDR is wrong