xref: /btstack/tool/misc/fix-misra-10.4a.py (revision 19d4ba91827c9a971ec0d72996860a381667a629)
1*19d4ba91SMatthias Ringwald#!/usr/bin/env python3
2*19d4ba91SMatthias Ringwaldimport os
3*19d4ba91SMatthias Ringwaldimport sys
4*19d4ba91SMatthias Ringwaldimport re
5*19d4ba91SMatthias Ringwaldimport fileinput
6*19d4ba91SMatthias Ringwald
7*19d4ba91SMatthias Ringwald# find root
8*19d4ba91SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
9*19d4ba91SMatthias Ringwaldprint(btstack_root)
10*19d4ba91SMatthias Ringwald
11*19d4ba91SMatthias Ringwald# messages
12*19d4ba91SMatthias Ringwaldcstat_file = 'cstat.txt'
13*19d4ba91SMatthias Ringwald
14*19d4ba91SMatthias Ringwald# project prefix
15*19d4ba91SMatthias Ringwaldproject_prefixes = [ 'c:\\projects\\iar\\btstack\\btstack\\',
16*19d4ba91SMatthias Ringwald                     'c:/users/buildbot/buildbot-worker/cstat-develop/btstack/']
17*19d4ba91SMatthias Ringwald
18*19d4ba91SMatthias Ringwalddef fix(path, lineno, expression):
19*19d4ba91SMatthias Ringwald    source_path = btstack_root + "/" + path
20*19d4ba91SMatthias Ringwald    print(source_path, lineno, expression)
21*19d4ba91SMatthias Ringwald    with open(source_path + '.cocci_res') as cocci_fd:
22*19d4ba91SMatthias Ringwald        cocci_lines = cocci_fd.readlines()
23*19d4ba91SMatthias Ringwald        for line_source, line_fix in zip(fileinput.input(source_path, inplace=True), cocci_lines):
24*19d4ba91SMatthias Ringwald            if fileinput.lineno() == lineno:
25*19d4ba91SMatthias Ringwald                sys.stdout.write(line_fix)
26*19d4ba91SMatthias Ringwald            else:
27*19d4ba91SMatthias Ringwald                sys.stdout.write(line_source)
28*19d4ba91SMatthias Ringwald
29*19d4ba91SMatthias Ringwaldwith open(cstat_file, 'rt') as fin:
30*19d4ba91SMatthias Ringwald    fixed = 0
31*19d4ba91SMatthias Ringwald    total = 0
32*19d4ba91SMatthias Ringwald    for line in fin:
33*19d4ba91SMatthias Ringwald        chunks = line.strip().split('\t')
34*19d4ba91SMatthias Ringwald        if len(chunks) != 4: continue
35*19d4ba91SMatthias Ringwald        (msg, rule, severity, location) = chunks
36*19d4ba91SMatthias Ringwald        if not rule.startswith('MISRAC2012-Rule-10.4_a'): continue
37*19d4ba91SMatthias Ringwald        total += 1
38*19d4ba91SMatthias Ringwald        # remove project prefix
39*19d4ba91SMatthias Ringwald        for project_prefix in project_prefixes:
40*19d4ba91SMatthias Ringwald            location = location.replace(project_prefix, '').replace('\\','/')
41*19d4ba91SMatthias Ringwald        parts = location.split(':')
42*19d4ba91SMatthias Ringwald        (path, lineno) = parts
43*19d4ba91SMatthias Ringwald        match = re.match("The operands `(.+)' and `(.+)' have essential type categories (.*) and (.*), which do not match.", msg)
44*19d4ba91SMatthias Ringwald        # fix if operand is signed literal and cstat complains about signednesss
45*19d4ba91SMatthias Ringwald        if match:
46*19d4ba91SMatthias Ringwald            (op1, op2, t1, t2) = match.groups()
47*19d4ba91SMatthias Ringwald            if re.match("[(0x)0-9]+", op1) and t1.startswith('signed'):
48*19d4ba91SMatthias Ringwald                fix(path, int(lineno), op1)
49*19d4ba91SMatthias Ringwald                fixed += 1
50*19d4ba91SMatthias Ringwald                continue
51*19d4ba91SMatthias Ringwald            if re.match("[(0x)0-9]+", op2) and t2.startswith('signed'):
52*19d4ba91SMatthias Ringwald                fix(path, int(lineno), op2)
53*19d4ba91SMatthias Ringwald                fixed += 1
54*19d4ba91SMatthias Ringwald                continue
55*19d4ba91SMatthias Ringwald    print ("Fixed %u of %u messages" % (fixed, total))
56