From c207828a1108200cbdfbf686dac4a00355335d33 Mon Sep 17 00:00:00 2001 From: Georgy Komarov Date: Mon, 4 Nov 2019 08:58:33 +0300 Subject: [PATCH] misra.py: Fix large memory usage with suppressions (#2321) * misra.py: Fix large memory usage with suppressions Don't save whole lxml locations when collecting rules suppressions statistics. This fixes the problem with large memory usage when some rules are suppressed. See issue description: https://sourceforge.net/p/cppcheck/discussion/development/thread/51fc053626/ * don't override 'file' builtin --- addons/misra.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index ed27f042e..e234a0106 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -727,7 +727,7 @@ class MisraChecker: # Prefix to ignore when matching suppression files. self.filePrefix = None - # Statistics of all violations suppressed per rule + # Number of all violations suppressed per rule self.suppressionStats = dict() self.stdversion = stdversion @@ -2154,10 +2154,13 @@ class MisraChecker: ruleItemList.append(line_symbol) - def isRuleSuppressed(self, location, ruleNum): + def isRuleSuppressed(self, file_path, linenr, ruleNum): """ Check to see if a rule is suppressed. - ruleNum is the rule number in hundreds format + + :param ruleNum: is the rule number in hundreds format + :param file_path: File path of checked location + :param linenr: Line number of checked location If the rule exists in the dict then check for a filename If the filename is None then rule is suppressed globally @@ -2172,15 +2175,14 @@ class MisraChecker: """ ruleIsSuppressed = False - linenr = location.linenr # Remove any prefix listed in command arguments from the filename. filename = None - if location.file is not None: + if file_path is not None: if self.filePrefix is not None: - filename = remove_file_prefix(location.file, self.filePrefix) + filename = remove_file_prefix(file_path, self.filePrefix) else: - filename = os.path.basename(location.file) + filename = os.path.basename(file_path) if ruleNum in self.suppressedRules: fileDict = self.suppressedRules[ruleNum] @@ -2263,7 +2265,7 @@ class MisraChecker: else: item_str = str(item[0]) - outlist.append("%s: %s: %s (%d locations suppressed)" % (float(ruleNum)/100,fname,item_str, len(self.suppressionStats.get(ruleNum, [])))) + outlist.append("%s: %s: %s (%d locations suppressed)" % (float(ruleNum)/100,fname,item_str, self.suppressionStats.get(ruleNum, 0))) for line in sorted(outlist, reverse=True): print(" %s" % line) @@ -2297,11 +2299,10 @@ class MisraChecker: if self.settings.verify: self.verify_actual.append(str(location.linenr) + ':' + str(num1) + '.' + str(num2)) - elif self.isRuleSuppressed(location, ruleNum): + elif self.isRuleSuppressed(location.file, location.linenr, ruleNum): # Error is suppressed. Ignore - if not ruleNum in self.suppressionStats: - self.suppressionStats[ruleNum] = [] - self.suppressionStats[ruleNum].append(location) + self.suppressionStats.setdefault(ruleNum, 0) + self.suppressionStats[ruleNum] += 1 return else: errorId = 'c2012-' + str(num1) + '.' + str(num2)