-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrule_checker.py
executable file
·51 lines (39 loc) · 1.67 KB
/
rule_checker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
import sys
from violation import RuleViolation
def check_rules( call_tree, func_types, rules, standard_funcs ):
"""
Given a program call tree, a mapping from function to its type, and
a set of rules, apply each rule and return all the rule violations
"""
for rule in rules:
yield from rule.check( call_tree, func_types, standard_funcs )
if __name__ == '__main__':
import scrapers
import call_tree
from ast_helpers import get_translation_unit
from type_augmentor import augment_types
from rules import parse_rules_file
from pprint import pprint
ext_types, rules = parse_rules_file( sys.argv[ 2 ] )
target = get_translation_unit( sys.argv[ 1 ] )
call_tree = call_tree.build_call_tree( target )
overrides = scrapers.Overrides.scrape( target )
func_cursors = scrapers.FunctionCursors.scrape( target )
func_types = scrapers.merge_disjoint_dicts( [
scrapers.FunctionQualifiers.scrape( target ),
ext_types ] )
standard_funcs = set( func_types.keys() )
funcptr_types = scrapers.FunctionPointers.scrape( target )
assignments = scrapers.FunPtrAssignments.scrape( target )
call_tree.augment_with_overrides( overrides )
aug_func_types = augment_types( call_tree, funcptr_types, func_types )
all_func_types = scrapers.merge_disjoint_dicts(
[ aug_func_types, funcptr_types ] )
rule_violations = check_rules(
call_tree, all_func_types, rules, standard_funcs )
for violation in rule_violations:
print(
violation.render_string(
func_cursors, funcptr_types, aug_func_types ) )
print()