btstack/tool/misc/fix-misra-10.4a.py

56 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import re
import fileinput
# find root
btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
print(btstack_root)
# messages
cstat_file = 'cstat.txt'
# project prefix
project_prefixes = [ 'c:\\projects\\iar\\btstack\\btstack\\',
'c:/users/buildbot/buildbot-worker/cstat-develop/btstack/']
def fix(path, lineno, expression):
source_path = btstack_root + "/" + path
print(source_path, lineno, expression)
with open(source_path + '.cocci_res') as cocci_fd:
cocci_lines = cocci_fd.readlines()
for line_source, line_fix in zip(fileinput.input(source_path, inplace=True), cocci_lines):
if fileinput.lineno() == lineno:
sys.stdout.write(line_fix)
else:
sys.stdout.write(line_source)
with open(cstat_file, 'rt') as fin:
fixed = 0
total = 0
for line in fin:
chunks = line.strip().split('\t')
if len(chunks) != 4: continue
(msg, rule, severity, location) = chunks
if not rule.startswith('MISRAC2012-Rule-10.4_a'): continue
total += 1
# remove project prefix
for project_prefix in project_prefixes:
location = location.replace(project_prefix, '').replace('\\','/')
parts = location.split(':')
(path, lineno) = parts
match = re.match("The operands `(.+)' and `(.+)' have essential type categories (.*) and (.*), which do not match.", msg)
# fix if operand is signed literal and cstat complains about signednesss
if match:
(op1, op2, t1, t2) = match.groups()
if re.match("[(0x)0-9]+", op1) and t1.startswith('signed'):
fix(path, int(lineno), op1)
fixed += 1
continue
if re.match("[(0x)0-9]+", op2) and t2.startswith('signed'):
fix(path, int(lineno), op2)
fixed += 1
continue
print ("Fixed %u of %u messages" % (fixed, total))