5 questions to test your understanding
Coverage-guided fuzzing measures code coverage (e.g., number of branches executed) and generates new inputs to increase coverage. Why is coverage guidance more effective than random testing?
Grammar-based fuzzing generates inputs using formal specifications (e.g., context-free grammars). How does this differ from random input generation?
Metamorphic testing is a formal methods technique for fuzzing. If you have a program function sqrt(x) that computes square roots, a metamorphic relation might be: sqrt(4*x^2) = 2*sqrt(x^2) = 2*abs(x). How does this enable bug detection?
Hybrid fuzzing combines fuzzing with symbolic execution. When should you use fuzzing vs. symbolic execution vs. the hybrid?
Spec-based fuzzing uses formal specifications to generate inputs and check properties. What formal specification languages are commonly used for fuzzing?