| DartLibFuzzer |
| ============= |
| |
| DartLibFuzzer is a fuzzing tool built with LibFuzzer, which |
| is an in-process, coverage-guided, evolutionary fuzzing engine. |
| The DartLibFuzzer tool consists of a collection of "target |
| functions", each of which stresses a particular part of the |
| Dart runtime and compiler. |
| |
| How to build and run DartLibFuzzer |
| ================================== |
| |
| Build the dart_libfuzzer binary as follows (first either export |
| DART_USE_ASAN=1 or run ./tools/gn.py --mode=debug --asan): |
| |
| ./tools/build.py \ |
| -m [all|debug|release|product] \ |
| -a [x64|arm64|simarm64] \ |
| dart_libfuzzer |
| |
| Then, to start a blank fuzzing session on a particular target |
| function (as defined in dart_libfuzzer.cc), run: |
| |
| dart_libfuzzer [--t=<target-function>] |
| |
| To start a fuzzing session with an initial corpus inside |
| the directory CORPUS, run: |
| |
| dart_libfuzzer CORPUS |
| |
| Background |
| ========== |
| |
| Although test suites are extremely useful to validate the correctness of a |
| system and to ensure that no regressions occur, any test suite is necessarily |
| finite in size and scope. Tests typically focus on validating particular |
| features by means of code sequences most programmers would expect. Regression |
| tests often use slightly less idiomatic code sequences, since they reflect |
| problems that were not anticipated originally, but occurred “in the field”. |
| Still, any test suite leaves the developer wondering whether undetected bugs |
| and flaws still linger in the system. |
| |
| Over the years, fuzz testing has gained popularity as a testing technique for |
| discovering such lingering bugs, including bugs that can bring down a system |
| in an unexpected way. Fuzzing refers to feeding a large amount of random data |
| as input to a system in an attempt to find bugs or make it crash. |
| Generation-based fuzz testing constructs random, but properly formatted input |
| data. Mutation-based fuzz testing applies small random changes to existing |
| inputs in order to detect shortcomings in a system. Profile-guided or |
| coverage-guided fuzz testing adds a direction to the way these random changes |
| are applied. Multi-layered approaches generate random inputs that are |
| subsequently mutated at various stages of execution. |
| |
| The randomness of fuzz testing implies that the size and scope of testing is |
| no longer bounded. Every new run can potentially discover bugs and crashes |
| that were hereto undetected. |
| |
| Links |
| ===== |
| |
| * [Dart bugs found with fuzzing](https://github.com/dart-lang/sdk/issues?utf8=%E2%9C%93&q=label%3Adartfuzz+) |
| * [DartFuzz](https://github.com/dart-lang/sdk/tree/master/runtime/tools/dartfuzz) |
| * [DartLibFuzzer](https://github.com/dart-lang/sdk/tree/master/runtime/vm/libfuzzer) |
| * [Dust](https://pub.dev/packages/dust) |
| * [LibFuzzer](https://llvm.org/docs/LibFuzzer.html) |