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