misra.py: Squelch duplicate violation messages

When checking multiple files if the same violation is encountered from
an included file then the violation is both displayed and counted in the
error summary.

Track each violation by location and error number and if the violation
has been previously encountered then do not report it again.
This commit is contained in:
Richard A. Smith 2020-07-16 16:29:17 -03:00
parent 58638d7757
commit 41a846d8a7
1 changed files with 12 additions and 4 deletions

View File

@ -1059,6 +1059,8 @@ class MisraChecker:
self.severity = None self.severity = None
self.existing_violations = set()
def __repr__(self): def __repr__(self):
attrs = ["settings", "verify_expected", "verify_actual", "violations", attrs = ["settings", "verify_expected", "verify_actual", "violations",
"ruleTexts", "suppressedRules", "dumpfileSuppressions", "ruleTexts", "suppressedRules", "dumpfileSuppressions",
@ -2726,11 +2728,17 @@ class MisraChecker:
if self.severity: if self.severity:
cppcheck_severity = self.severity cppcheck_severity = self.severity
cppcheckdata.reportError(location, cppcheck_severity, errmsg, 'misra', errorId, misra_severity) this_violation = '{}-{}-{}-{}'.format(location.file, location.linenr, location.column, ruleNum)
if misra_severity not in self.violations: # If this is new violation then record it and show it. If not then
self.violations[misra_severity] = [] # skip it since it has already been displayed.
self.violations[misra_severity].append('misra-' + errorId) if not this_violation in self.existing_violations:
self.existing_violations.add(this_violation)
cppcheckdata.reportError(location, cppcheck_severity, errmsg, 'misra', errorId, misra_severity)
if misra_severity not in self.violations:
self.violations[misra_severity] = []
self.violations[misra_severity].append('misra-' + errorId)
def loadRuleTexts(self, filename): def loadRuleTexts(self, filename):
num1 = 0 num1 = 0