Compare raw byte mutation against grammar-guided generation on a tiny arithmetic language. Watch parser acceptance, semantic execution, and bug discovery diverge under the same search budget.
Both lanes use the same budget and the same bad-state predicate. The only difference is the witness language. One lane spends budget on arbitrary strings. The other stays inside the arithmetic grammar.
Use the default seed and click Run both strategies. Then compare parser acceptance, semantic execution, and bug witnesses. After that, change the seed and see whether the grammar lane still keeps more of the budget alive.
Expr ::= Num
| (Expr + Expr)
| (Expr / Expr)
Num ::= 0 | 1 | 2 | 3
Bad(x) holds if: 1. x parses under the grammar 2. x reaches semantic evaluation 3. evaluation attempts division by zero
Run both strategies first for the clearest comparison. Single-lane runs fill only one side.
not run yet
not run yet