misra.py: Fix 5.1 and 5.2 FP for c99 (#2625)

This commit is contained in:
felwolff 2020-04-28 07:18:54 +02:00 committed by GitHub
parent 30e6214f1c
commit b65d72aeb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 8 additions and 6 deletions

View File

@ -1158,14 +1158,15 @@ class MisraChecker:
def misra_5_1(self, data): def misra_5_1(self, data):
long_vars = {} long_vars = {}
num_sign_chars = self.get_num_significant_naming_chars(data)
for var in data.variables: for var in data.variables:
if var.nameToken is None: if var.nameToken is None:
continue continue
if len(var.nameToken.str) <= 31: if len(var.nameToken.str) <= num_sign_chars:
continue continue
if not hasExternalLinkage(var): if not hasExternalLinkage(var):
continue continue
long_vars.setdefault(var.nameToken.str[:31], []).append(var.nameToken) long_vars.setdefault(var.nameToken.str[:num_sign_chars], []).append(var.nameToken)
for name_prefix in long_vars: for name_prefix in long_vars:
tokens = long_vars[name_prefix] tokens = long_vars[name_prefix]
if len(tokens) < 2: if len(tokens) < 2:
@ -1175,10 +1176,11 @@ class MisraChecker:
def misra_5_2(self, data): def misra_5_2(self, data):
scopeVars = {} scopeVars = {}
num_sign_chars = self.get_num_significant_naming_chars(data)
for var in data.variables: for var in data.variables:
if var.nameToken is None: if var.nameToken is None:
continue continue
if len(var.nameToken.str) <= 31: if len(var.nameToken.str) <= num_sign_chars:
continue continue
if var.nameToken.scope not in scopeVars: if var.nameToken.scope not in scopeVars:
scopeVars.setdefault(var.nameToken.scope, {})["varlist"] = [] scopeVars.setdefault(var.nameToken.scope, {})["varlist"] = []
@ -1199,14 +1201,14 @@ class MisraChecker:
continue continue
if hasExternalLinkage(variable1) or hasExternalLinkage(variable2): if hasExternalLinkage(variable1) or hasExternalLinkage(variable2):
continue continue
if (variable1.nameToken.str[:31] == variable2.nameToken.str[:31] and if (variable1.nameToken.str[:num_sign_chars] == variable2.nameToken.str[:num_sign_chars] and
variable1.Id != variable2.Id): variable1.Id != variable2.Id):
if int(variable1.nameToken.linenr) > int(variable2.nameToken.linenr): if int(variable1.nameToken.linenr) > int(variable2.nameToken.linenr):
self.reportError(variable1.nameToken, 5, 2) self.reportError(variable1.nameToken, 5, 2)
else: else:
self.reportError(variable2.nameToken, 5, 2) self.reportError(variable2.nameToken, 5, 2)
for innerscope in scopeVars[scope]["scopelist"]: for innerscope in scopeVars[scope]["scopelist"]:
if variable1.nameToken.str[:31] == innerscope.className[:31]: if variable1.nameToken.str[:num_sign_chars] == innerscope.className[:num_sign_chars]:
if int(variable1.nameToken.linenr) > int(innerscope.bodyStart.linenr): if int(variable1.nameToken.linenr) > int(innerscope.bodyStart.linenr):
self.reportError(variable1.nameToken, 5, 2) self.reportError(variable1.nameToken, 5, 2)
else: else:
@ -1215,7 +1217,7 @@ class MisraChecker:
continue continue
for i, scopename1 in enumerate(scopeVars[scope]["scopelist"]): for i, scopename1 in enumerate(scopeVars[scope]["scopelist"]):
for scopename2 in scopeVars[scope]["scopelist"][i + 1:]: for scopename2 in scopeVars[scope]["scopelist"][i + 1:]:
if scopename1.className[:31] == scopename2.className[:31]: if scopename1.className[:num_sign_chars] == scopename2.className[:num_sign_chars]:
if int(scopename1.bodyStart.linenr) > int(scopename2.bodyStart.linenr): if int(scopename1.bodyStart.linenr) > int(scopename2.bodyStart.linenr):
self.reportError(scopename1.bodyStart, 5, 2) self.reportError(scopename1.bodyStart, 5, 2)
else: else: