summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-10 21:03:40 +0000
committerpatrick <patrick@openbsd.org>2020-08-10 21:03:40 +0000
commit3cab2bb3f667058bece8e38b12449a63a9d73c4b (patch)
tree732ebd68e507f798225d97f4f2dd7ff8468d3e17 /gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py
parentReduce log spam. (diff)
downloadwireguard-openbsd-3cab2bb3f667058bece8e38b12449a63a9d73c4b.tar.xz
wireguard-openbsd-3cab2bb3f667058bece8e38b12449a63a9d73c4b.zip
Import compiler-rt 10.0.1 release.
ok kettenis@
Diffstat (limited to 'gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py')
-rwxr-xr-xgnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py b/gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py
new file mode 100755
index 00000000000..579e481a237
--- /dev/null
+++ b/gnu/llvm/compiler-rt/lib/fuzzer/scripts/unbalanced_allocs.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+#===- lib/fuzzer/scripts/unbalanced_allocs.py ------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+#
+# 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.items():
+ 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)