Skip to content

Commit d39060f

Browse files
committed
feat [task-08]: Use report severity when storing new checkers
- Modify __store_checker_identifiers to accept optional severity mapping - Update __get_faked_checkers to return severity info from reports - When creating new Checker entries, use report severity if available, fall back to checker labels otherwise
1 parent 6b48d93 commit d39060f

1 file changed

Lines changed: 33 additions & 9 deletions

File tree

web/server/codechecker_server/api/mass_store_run.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,11 @@ def __add_file_content(
820820
# the meantime.
821821
session.rollback()
822822

823-
def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
823+
def __store_checker_identifiers(
824+
self,
825+
checkers: Set[Tuple[str, str]],
826+
checker_severities: Optional[Dict[Tuple[str, str], str]] = None
827+
):
824828
"""
825829
Stores the identifiers "(analyzer, checker_name)" in the database into
826830
a look-up table where each unique checker is given a unique numeric
@@ -836,6 +840,10 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
836840
of a run to reduce contention if two parallel stores, especially across
837841
server instances (in a distributed/load-balanced environment) want to
838842
store the same identifier(s).
843+
844+
If `checker_severities` is provided, it maps (analyzer, checker) tuples
845+
to severity strings (e.g., "HIGH", "LOW"). This is used when severity
846+
information is available from the reports themselves (e.g., from SARIF).
839847
"""
840848
max_tries, tries, wait_time = 3, 0, timedelta(seconds=30)
841849
# The "fake" checker is a temporary row that is needed intermittently
@@ -844,6 +852,8 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
844852
# 'metadata.json', or, in the worst case, there might simply not be
845853
# a 'metadata.json' at all in the to-be-stored structure.
846854
all_checkers = {FakeChecker, UnknownChecker} | checkers
855+
if checker_severities is None:
856+
checker_severities = {}
847857
while tries < max_tries:
848858
tries += 1
849859
try:
@@ -856,8 +866,12 @@ def __store_checker_identifiers(self, checkers: Set[Tuple[str, str]]):
856866
.all()}
857867
for analyzer, checker in \
858868
sorted(all_checkers - known_checkers):
859-
s = self.__package_context.checker_labels \
860-
.severity(checker)
869+
# Use severity from reports if available, otherwise
870+
# fall back to checker labels.
871+
s = checker_severities.get((analyzer, checker))
872+
if not s:
873+
s = self.__package_context.checker_labels \
874+
.severity(checker)
861875
s = ttypes.Severity._NAMES_TO_VALUES[s]
862876
session.add(Checker(analyzer, checker, s))
863877
LOG.debug("Acquiring ID for checker '%s/%s' "
@@ -1160,16 +1174,25 @@ def __add_report(
11601174
return db_report.id
11611175

11621176
def __get_faked_checkers(self) \
1163-
-> Set[Tuple[str, str]]:
1177+
-> Tuple[Set[Tuple[str, str]], Dict[Tuple[str, str], str]]:
11641178
"""
11651179
Extracts the "real" checker identifiers from the
11661180
__reports_with_fake_checkers that might contain some yet not fully
11671181
handled reports by __add_report(). This function does NOT touch the
11681182
database!
1183+
1184+
Returns a tuple of (checkers, severities) where:
1185+
- checkers: set of (analyzer, checker_name) tuples
1186+
- severities: dict mapping (analyzer, checker_name) to severity string
11691187
"""
1170-
return set(checker_name_for_report(report)
1171-
for report, _
1172-
in self.__reports_with_fake_checkers.values())
1188+
checkers = set()
1189+
severities = {}
1190+
for report, _ in self.__reports_with_fake_checkers.values():
1191+
checker = checker_name_for_report(report)
1192+
checkers.add(checker)
1193+
if report.severity and checker not in severities:
1194+
severities[checker] = report.severity
1195+
return checkers, severities
11731196

11741197
def __load_report_ids_for_reports_with_fake_checkers(self, session):
11751198
"""
@@ -1674,11 +1697,12 @@ def store(self,
16741697
self._name,
16751698
"Get look-up IDs for checkers not present in "
16761699
"'metadata.json'"):
1677-
additional_checkers = self.__get_faked_checkers()
1700+
additional_checkers, checker_severities = \
1701+
self.__get_faked_checkers()
16781702
# __store_checker_identifiers() has its own
16791703
# TRANSACTION!
16801704
self.__store_checker_identifiers(
1681-
additional_checkers)
1705+
additional_checkers, checker_severities)
16821706

16831707
with DBSession(self.__product.session_factory) as session, \
16841708
RunLock(session, self._name):

0 commit comments

Comments
 (0)