[PATCH 22/22] Add contrib/get-static-analysis.py
David Malcolm
dmalcolm@redhat.com
Fri Aug 4 21:36:00 GMT 2017
This patch adds a simple Python 2/3 script for reading the
static analysis "watermark" from object files, writing the
JSON to stdout (prettyprinting it with indentation and newlines
for ease of human reading).
contrib/ChangeLog:
* get-static-analysis.py: New file.
---
contrib/get-static-analysis.py | 47 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 contrib/get-static-analysis.py
diff --git a/contrib/get-static-analysis.py b/contrib/get-static-analysis.py
new file mode 100644
index 0000000..c246718
--- /dev/null
+++ b/contrib/get-static-analysis.py
@@ -0,0 +1,47 @@
+# FIXME
+# Extract static analysis results from input file and pretty-print JSON to stdout
+# This file is intended to be compatible with both Python 2 and Python 3
+
+import json
+import os
+import subprocess
+import sys
+import tempfile
+
+SECTION_NAME = '.gnu.build.attributes'
+
+def get_json_content(filename):
+ """
+ Extract the JSON from SECTION_NAME from filename, returning
+ as a bytes instance.
+ """
+ with tempfile.NamedTemporaryFile() as outfile:
+ try:
+ subprocess.check_call(['objcopy', '-O', 'binary',
+ '--only-section=%s' % SECTION_NAME,
+ '--set-section-flags',
+ '%s=alloc' % SECTION_NAME,
+ filename, outfile.name])
+ except subprocess.CalledProcessError:
+ if not os.path.exists(outfile.name):
+ outfile.delete = False
+ raise
+ with open(outfile.name, 'rb') as f_in:
+ buf = f_in.read()
+ if not buf:
+ raise ValueError('section not found: %s' % SECTION_NAME)
+ # Expect 16 bytes of header, then JSON, then a 0-terminator and padding
+ json_buf = buf[16:].split(b'\x00')[0]
+ return json_buf
+
+filename = sys.argv[1]
+try:
+ json_buf = get_json_content(filename)
+except subprocess.CalledProcessError:
+ sys.exit(1)
+except ValueError as exc:
+ print(exc)
+ sys.exit(1)
+json_str = json_buf.decode('utf-8')
+jv = json.loads(json_str)
+json.dump(jv, sys.stdout, indent=4)
--
1.8.5.3
More information about the Gcc-patches
mailing list