]> git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py
New upstream version 1.25.0+dfsg1
[rustc.git] / src / libcompiler_builtins / compiler-rt / lib / fuzzer / scripts / unbalanced_allocs.py
1 #!/usr/bin/env python
2 #===- lib/fuzzer/scripts/unbalanced_allocs.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 #
11 # Post-process -trace_malloc=2 output and printout only allocations and frees
12 # unbalanced inside of fuzzer runs.
13 # Usage:
14 # my_fuzzer -trace_malloc=2 -runs=10 2>&1 | unbalanced_allocs.py -skip=5
15 #
16 #===------------------------------------------------------------------------===#
17
18 import argparse
19 import sys
20
21 _skip = 0
22
23 def PrintStack(line, stack):
24 global _skip
25 if _skip > 0:
26 return
27 print 'Unbalanced ' + line.rstrip();
28 for l in stack:
29 print l.rstrip()
30
31 def ProcessStack(line, f):
32 stack = []
33 while line and line.startswith(' #'):
34 stack += [line]
35 line = f.readline()
36 return line, stack
37
38 def ProcessFree(line, f, allocs):
39 if not line.startswith('FREE['):
40 return f.readline()
41
42 addr = int(line.split()[1], 16)
43 next_line, stack = ProcessStack(f.readline(), f)
44 if addr in allocs:
45 del allocs[addr]
46 else:
47 PrintStack(line, stack)
48 return next_line
49
50 def ProcessMalloc(line, f, allocs):
51 if not line.startswith('MALLOC['):
52 return ProcessFree(line, f, allocs)
53
54 addr = int(line.split()[1], 16)
55 assert not addr in allocs
56
57 next_line, stack = ProcessStack(f.readline(), f)
58 allocs[addr] = (line, stack)
59 return next_line
60
61 def ProcessRun(line, f):
62 if not line.startswith('MallocFreeTracer: START'):
63 return ProcessMalloc(line, f, {})
64
65 allocs = {}
66 print line.rstrip()
67 line = f.readline()
68 while line:
69 if line.startswith('MallocFreeTracer: STOP'):
70 global _skip
71 _skip = _skip - 1
72 for _, (l, s) in allocs.iteritems():
73 PrintStack(l, s)
74 print line.rstrip()
75 return f.readline()
76 line = ProcessMalloc(line, f, allocs)
77 return line
78
79 def ProcessFile(f):
80 line = f.readline()
81 while line:
82 line = ProcessRun(line, f);
83
84 def main(argv):
85 parser = argparse.ArgumentParser()
86 parser.add_argument('--skip', default=0, help='number of runs to ignore')
87 args = parser.parse_args()
88 global _skip
89 _skip = int(args.skip) + 1
90 ProcessFile(sys.stdin)
91
92 if __name__ == '__main__':
93 main(sys.argv)