summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2017-10-31 20:50:07 +0000
committerVitaly Buka <vitalybuka@google.com>2017-10-31 20:50:07 +0000
commit142775ac8314b5a2accfb9832e7226856deddbe9 (patch)
treeccd2444bba41d8f246b309421dcdbbe8fe5aabac /lib
parent8ddc9eb9566b6cafb848d87323303cd5089fa4b2 (diff)
[fuzzer] Script to detect unbalanced allocation in -trace_malloc output
Reviewers: kcc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D39466 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@317036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rwxr-xr-xlib/fuzzer/scripts/unbalanced_allocs.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/fuzzer/scripts/unbalanced_allocs.py b/lib/fuzzer/scripts/unbalanced_allocs.py
new file mode 100755
index 000000000..a4ce18767
--- /dev/null
+++ b/lib/fuzzer/scripts/unbalanced_allocs.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#===- lib/fuzzer/scripts/unbalanced_allocs.py ------------------------------===#
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+#===------------------------------------------------------------------------===#
+#
+# Post-process -trace_malloc=2 output and printout only allocations and frees
+# unbalanced inside of fuzzer runs.
+# Usage:
+# my_fuzzer -trace_malloc=2 -runs=10 2>&1 | unbalanced_allocs.py -skip=5
+#
+#===------------------------------------------------------------------------===#
+
+import argparse
+import sys
+
+_skip = 0
+
+def PrintStack(line, stack):
+ global _skip
+ if _skip > 0:
+ return
+ print 'Unbalanced ' + line.rstrip();
+ for l in stack:
+ print l.rstrip()
+
+def ProcessStack(line, f):
+ stack = []
+ while line and line.startswith(' #'):
+ stack += [line]
+ line = f.readline()
+ return line, stack
+
+def ProcessFree(line, f, allocs):
+ if not line.startswith('FREE['):
+ return f.readline()
+
+ addr = int(line.split()[1], 16)
+ next_line, stack = ProcessStack(f.readline(), f)
+ if addr in allocs:
+ del allocs[addr]
+ else:
+ PrintStack(line, stack)
+ return next_line
+
+def ProcessMalloc(line, f, allocs):
+ if not line.startswith('MALLOC['):
+ return ProcessFree(line, f, allocs)
+
+ addr = int(line.split()[1], 16)
+ assert not addr in allocs
+
+ next_line, stack = ProcessStack(f.readline(), f)
+ allocs[addr] = (line, stack)
+ return next_line
+
+def ProcessRun(line, f):
+ if not line.startswith('MallocFreeTracer: START'):
+ return ProcessMalloc(line, f, {})
+
+ allocs = {}
+ print line.rstrip()
+ line = f.readline()
+ while line:
+ if line.startswith('MallocFreeTracer: STOP'):
+ global _skip
+ _skip = _skip - 1
+ for _, (l, s) in allocs.iteritems():
+ PrintStack(l, s)
+ print line.rstrip()
+ return f.readline()
+ line = ProcessMalloc(line, f, allocs)
+ return line
+
+def ProcessFile(f):
+ line = f.readline()
+ while line:
+ line = ProcessRun(line, f);
+
+def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--skip', default=0, help='number of runs to ignore')
+ args = parser.parse_args()
+ global _skip
+ _skip = int(args.skip) + 1
+ ProcessFile(sys.stdin)
+
+if __name__ == '__main__':
+ main(sys.argv)