Kostya Serebryany | 980e45f | 2018-05-31 01:27:07 +0000 | [diff] [blame^] | 1 | #!/usr/bin/env python |
| 2 | #===- lib/fuzzer/scripts/collect_data_flow.py ------------------------------===# |
| 3 | # |
| 4 | # The LLVM Compiler Infrastructure |
| 5 | # |
| 6 | # This file is distributed under the University of Illinois Open Source |
| 7 | # License. See LICENSE.TXT for details. |
| 8 | # |
| 9 | #===------------------------------------------------------------------------===# |
| 10 | # Runs the data-flow tracer several times on the same input in order to collect |
| 11 | # the complete trace for all input bytes (running it on all bytes at once |
| 12 | # may fail if DFSan runs out of labels). |
| 13 | # Usage: |
| 14 | # collect_data_flow.py BINARY INPUT [RESULT] |
| 15 | #===------------------------------------------------------------------------===# |
| 16 | import atexit |
| 17 | import sys |
| 18 | import os |
| 19 | import subprocess |
| 20 | import tempfile |
| 21 | import shutil |
| 22 | |
| 23 | tmpdir = "" |
| 24 | |
| 25 | def cleanup(d): |
| 26 | print "removing: ", d |
| 27 | shutil.rmtree(d) |
| 28 | |
| 29 | def main(argv): |
| 30 | exe = argv[1] |
| 31 | inp = argv[2] |
| 32 | size = os.path.getsize(inp) |
| 33 | q = [[0, size]] |
| 34 | tmpdir = tempfile.mkdtemp(prefix="libfuzzer-tmp-") |
| 35 | atexit.register(cleanup, tmpdir) |
| 36 | print "tmpdir: ", tmpdir |
| 37 | outputs = [] |
| 38 | while len(q): |
| 39 | r = q.pop() |
| 40 | print "******* Trying: ", r |
| 41 | tmpfile = os.path.join(tmpdir, str(r[0]) + "-" + str(r[1])) |
| 42 | ret = subprocess.call([exe, str(r[0]), str(r[1]), inp, tmpfile]) |
| 43 | if ret and r[1] - r[0] >= 2: |
| 44 | q.append([r[0], (r[1] + r[0]) / 2]) |
| 45 | q.append([(r[1] + r[0]) / 2, r[1]]) |
| 46 | else: |
| 47 | outputs.append(tmpfile) |
| 48 | print "******* Success: ", r |
| 49 | f = sys.stdout |
| 50 | if len(argv) >= 4: |
| 51 | f = open(argv[3], "w") |
| 52 | merge = os.path.join(os.path.dirname(argv[0]), "merge_data_flow.py") |
| 53 | subprocess.call([merge] + outputs, stdout=f) |
| 54 | |
| 55 | if __name__ == '__main__': |
| 56 | main(sys.argv) |