mirror of
https://github.com/hohn/sarif-cli.git
synced 2025-12-16 09:13:04 +01:00
73 lines
2.4 KiB
Python
Executable File
73 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
""" Print the type signature of a sarif file, at various levels of verbosity.
|
|
"""
|
|
import argparse
|
|
import json
|
|
import sarif_cli.signature as S
|
|
import sys
|
|
from pprint import pprint
|
|
|
|
#
|
|
# Start processing
|
|
#
|
|
context = S.Context(
|
|
{
|
|
"string" : "String",
|
|
"int" : "Int",
|
|
"bool" : "Bool"
|
|
}
|
|
)
|
|
|
|
parser = argparse.ArgumentParser(description='Produce a summary of signatures found in the sarif file.')
|
|
parser.add_argument('file', metavar='sarif-file', type=str, help='input file, - for stdin')
|
|
parser.add_argument('-u', '--unique-array-signatures', action="store_true",
|
|
help='Only report unique array entry signatures')
|
|
parser.add_argument('-t', '--typedef-signatures', action="store_true",
|
|
help='Give every object signature a type and report by types')
|
|
parser.add_argument('-d', '--dot-output', action="store_true",
|
|
help='Output type table as dot graph. Implies -t -u')
|
|
parser.add_argument('-n', '--no-edges-to-scalars', action="store_true",
|
|
help='Suppress edges to int/bool/string types in dot graph. Implies -d')
|
|
parser.add_argument('-f', '--fill-structure', action="store_true",
|
|
help='Fill in missing (optional) entries in sarif input before other steps.')
|
|
args = parser.parse_args()
|
|
|
|
if args.no_edges_to_scalars:
|
|
args.dot_output = True
|
|
|
|
if args.dot_output:
|
|
args.unique_array_signatures = True
|
|
args.typedef_signatures = True
|
|
|
|
#
|
|
# Load data
|
|
#
|
|
with open(args.file, 'r') if args.file != '-' else sys.stdin as fp:
|
|
sarif_struct = json.load(fp)
|
|
#
|
|
# Preprocess if applicable
|
|
#
|
|
if args.fill_structure:
|
|
sarif_struct = S.fillsig(args, sarif_struct, context)
|
|
|
|
#
|
|
# Form signatures and write output
|
|
#
|
|
if args.dot_output:
|
|
S._signature(args, sarif_struct, context)
|
|
struct_graph = [(typedef, sig) for sig, typedef in context.sig_to_typedef.items()]
|
|
S.write_header(sys.stdout)
|
|
for typedef, sig in struct_graph:
|
|
S.write_node(sys.stdout, typedef, sig)
|
|
for typedef, sig in struct_graph:
|
|
S.write_edges(args, sys.stdout, typedef, sig)
|
|
S.write_footer(sys.stdout)
|
|
|
|
elif args.typedef_signatures:
|
|
S._signature(args, sarif_struct, context)
|
|
struct_graph = [(typedef, sig) for sig,typedef in context.sig_to_typedef.items()]
|
|
pprint(struct_graph, sys.stdout, indent=4)
|
|
|
|
else:
|
|
pprint(S._signature(args, sarif_struct, context), sys.stdout, indent=4)
|