Skip to content

Comments

fix(GeneralizationStage): forward crashes to objective feedback during gap probing#3738

Open
k5602 wants to merge 1 commit intoAFLplusplus:mainfrom
k5602:generalization_stage
Open

fix(GeneralizationStage): forward crashes to objective feedback during gap probing#3738
k5602 wants to merge 1 commit intoAFLplusplus:mainfrom
k5602:generalization_stage

Conversation

@k5602
Copy link

@k5602 k5602 commented Feb 23, 2026

Description

GeneralizationStage::verify_input executed candidate inputs via
executor.run_target() but never checked the returned ExitKind.
Crash, Timeout, and Oom results were silently discarded.

Because verify_input is called once for stability checking and then
on every intermediate candidate inside find_gaps (12 passes) and
find_gaps_in_closures (6 passes), the blind spot covered the entire
generalization phase — any input that triggered a new crash during
simplification would not be added to the solutions corpus.

Fix: After post_exec_all, check exit_kind != ExitKind::Ok and
forward the run to fuzzer.evaluate_execution(…, send_events: true),
identical to the pattern used in StdTMinMutationalStage. Then return
Ok(false) to abort generalization for that input.

Trait bounds added:

  • Z: ExecutionProcessor<EM, BytesInput, E::Observers, S> on the
    Stage impl, verify_input, find_gaps, and find_gaps_in_closures
    where-clauses (ordered alphabetically per project convention).

No behavior change for ExitKind::Ok runs.

Checklist

  • I have run ./scripts/precommit.sh and addressed all comments

Fixes #3288

…izationStage

verify_input called executor.run_target() directly and silently discarded
any ExitKind::Crash / Timeout / Oom result. Crashes found while probing
gap candidates were never forwarded to objective feedback and therefore
never added to the solutions corpus.

Fix: after post_exec_all, if exit_kind != ExitKind::Ok, delegate to
fuzzer.evaluate_execution() with send_events=true so objective/corpus
feedback runs through the canonical pipeline, then return Ok(false) to
halt generalization on the failing input.

Propagate the required Z: ExecutionProcessor<...> bound to the Stage
impl where-clause and to find_gaps / find_gaps_in_closures, which also
call verify_input on every reduced candidate.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

crash in grimoire's generalization stage is not added to objective corpus

1 participant