|
| 1 | +## Fuzzers |
| 2 | + |
| 3 | +To run a fuzzer locally, you need [go-fuzz](https://github.com/dvyukov/go-fuzz) installed. |
| 4 | + |
| 5 | +First build a fuzzing-binary out of the selected package: |
| 6 | + |
| 7 | +``` |
| 8 | +(cd ./rlp && CGO_ENABLED=0 go-fuzz-build .) |
| 9 | +``` |
| 10 | +That command should generate a `rlp-fuzz.zip` in the `rlp/` directory. If you are already in that directory, you can do |
| 11 | + |
| 12 | +``` |
| 13 | +[user@work rlp]$ go-fuzz |
| 14 | +2019/11/26 13:36:54 workers: 6, corpus: 3 (3s ago), crashers: 0, restarts: 1/0, execs: 0 (0/sec), cover: 0, uptime: 3s |
| 15 | +2019/11/26 13:36:57 workers: 6, corpus: 3 (6s ago), crashers: 0, restarts: 1/0, execs: 0 (0/sec), cover: 1054, uptime: 6s |
| 16 | +2019/11/26 13:37:00 workers: 6, corpus: 3 (9s ago), crashers: 0, restarts: 1/8358, execs: 25074 (2786/sec), cover: 1054, uptime: 9s |
| 17 | +2019/11/26 13:37:03 workers: 6, corpus: 3 (12s ago), crashers: 0, restarts: 1/8497, execs: 50986 (4249/sec), cover: 1054, uptime: 12s |
| 18 | +2019/11/26 13:37:06 workers: 6, corpus: 3 (15s ago), crashers: 0, restarts: 1/9330, execs: 74640 (4976/sec), cover: 1054, uptime: 15s |
| 19 | +2019/11/26 13:37:09 workers: 6, corpus: 3 (18s ago), crashers: 0, restarts: 1/9948, execs: 99482 (5527/sec), cover: 1054, uptime: 18s |
| 20 | +2019/11/26 13:37:12 workers: 6, corpus: 3 (21s ago), crashers: 0, restarts: 1/9428, execs: 122568 (5836/sec), cover: 1054, uptime: 21s |
| 21 | +2019/11/26 13:37:15 workers: 6, corpus: 3 (24s ago), crashers: 0, restarts: 1/9676, execs: 145152 (6048/sec), cover: 1054, uptime: 24s |
| 22 | +2019/11/26 13:37:18 workers: 6, corpus: 3 (27s ago), crashers: 0, restarts: 1/9855, execs: 167538 (6205/sec), cover: 1054, uptime: 27s |
| 23 | +2019/11/26 13:37:21 workers: 6, corpus: 3 (30s ago), crashers: 0, restarts: 1/9645, execs: 192901 (6430/sec), cover: 1054, uptime: 30s |
| 24 | +2019/11/26 13:37:24 workers: 6, corpus: 3 (33s ago), crashers: 0, restarts: 1/9967, execs: 219294 (6645/sec), cover: 1054, uptime: 33s |
| 25 | + |
| 26 | +``` |
| 27 | +Otherwise: |
| 28 | +``` |
| 29 | +go-fuzz -bin ./rlp/rlp-fuzz.zip |
| 30 | +``` |
| 31 | + |
| 32 | +### Notes |
| 33 | + |
| 34 | +Once a 'crasher' is found, the fuzzer tries to avoid reporting the same vector twice, so stores the fault in the `suppressions` folder. Thus, if you |
| 35 | +e.g. make changes to fix a bug, you should _remove_ all data from the `suppressions`-folder, to verify that the issue is indeed resolved. |
| 36 | + |
| 37 | +Also, if you have only one and the same exit-point for multiple different types of test, the suppression can make the fuzzer hide differnent types of errors. So make |
| 38 | +sure that each type of failure is unique (for an example, see the rlp fuzzer, where a counter `i` is used to differentiate between failures: |
| 39 | + |
| 40 | +```golang |
| 41 | + if !bytes.Equal(input, output) { |
| 42 | + panic(fmt.Sprintf("case %d: encode-decode is not equal, \ninput : %x\noutput: %x", i, input, output)) |
| 43 | + } |
| 44 | +``` |
| 45 | + |
0 commit comments