From 1ad9851c3fa4881d4552d25d47d68c12285a37ad Mon Sep 17 00:00:00 2001 From: Nora Zinaeddin Date: Tue, 29 Oct 2024 16:29:04 +0100 Subject: [PATCH] Handle ambigous profile/group parameters Introduce the -e group: option, to improve handling of ambigous parameters (such as "security" etc.) --- .../analyzers/config_handler.py | 41 ++++++++++++++----- analyzer/codechecker_analyzer/checkers.py | 3 +- analyzer/codechecker_analyzer/cmd/analyze.py | 23 +++++++++++ analyzer/codechecker_analyzer/cmd/check.py | 23 +++++++++++ analyzer/tests/unit/test_checker_handling.py | 32 +++++++++------ docs/analyzer/user_guide.md | 23 +++++++++++ 6 files changed, 120 insertions(+), 25 deletions(-) diff --git a/analyzer/codechecker_analyzer/analyzers/config_handler.py b/analyzer/codechecker_analyzer/analyzers/config_handler.py index bfc8be40fa..411f68f75e 100644 --- a/analyzer/codechecker_analyzer/analyzers/config_handler.py +++ b/analyzer/codechecker_analyzer/analyzers/config_handler.py @@ -12,8 +12,10 @@ from abc import ABCMeta from enum import Enum +from string import Template import collections import platform +import sys import re from codechecker_analyzer import analyzer_context @@ -210,23 +212,40 @@ def initialize_checkers(self, profiles = checker_labels.get_description('profile') guidelines = checker_labels.occurring_values('guideline') + templ = Template("The ${entity} name '${identifier}' conflicts with a " + "checker group name. Please use -e ${entity}: to " + "select checkers of a ${entity} or use -e group: " + "to select checkers which have a name " + "starting with '${identifier}'.") + for identifier, enabled in cmdline_enable: - if ':' in identifier: + if "group:" in identifier: + identifier = identifier.replace("group:", "") + self.set_checker_enabled(identifier, enabled) + + elif ':' in identifier: for checker in checker_labels.checkers_by_labels([identifier]): self.set_checker_enabled(checker, enabled) + elif identifier in profiles: if identifier in reserved_names: - LOG.warning("Profile name '%s' conflicts with a " - "checker(-group) name.", identifier) - for checker in checker_labels.checkers_by_labels( - [f'profile:{identifier}']): - self.set_checker_enabled(checker, enabled) + LOG.error(templ.substitute(entity="profile", + identifier=identifier)) + sys.exit(1) + else: + for checker in checker_labels.checkers_by_labels( + [f'profile:{identifier}']): + self.set_checker_enabled(checker, enabled) + elif identifier in guidelines: if identifier in reserved_names: - LOG.warning("Guideline name '%s' conflicts with a " - "checker(-group) name.", identifier) - for checker in checker_labels.checkers_by_labels( - [f'guideline:{identifier}']): - self.set_checker_enabled(checker, enabled) + LOG.error(templ.substitute(entity="guideline", + identifier=identifier)) + sys.exit(1) + else: + for checker in checker_labels.checkers_by_labels( + [f'guideline:{identifier}']): + self.set_checker_enabled(checker, enabled) + else: self.set_checker_enabled(identifier, enabled) diff --git a/analyzer/codechecker_analyzer/checkers.py b/analyzer/codechecker_analyzer/checkers.py index 1e9b6f7461..65bc57b031 100644 --- a/analyzer/codechecker_analyzer/checkers.py +++ b/analyzer/codechecker_analyzer/checkers.py @@ -23,7 +23,8 @@ def available(ordered_checkers, available_checkers): if checker_name.startswith('profile:') or \ checker_name.startswith('guideline:') or \ checker_name.startswith('severity:') or \ - checker_name.startswith('sei-cert:'): + checker_name.startswith('sei-cert:') or \ + checker_name.startswith('group:'): continue name_match = False diff --git a/analyzer/codechecker_analyzer/cmd/analyze.py b/analyzer/codechecker_analyzer/cmd/analyze.py index 42e9336ad4..d9cf601774 100644 --- a/analyzer/codechecker_analyzer/cmd/analyze.py +++ b/analyzer/codechecker_analyzer/cmd/analyze.py @@ -699,6 +699,21 @@ def add_arguments_to_parser(parser): Note that compiler errors and warnings are captured by CodeChecker only if it was emitted by clang-tidy. +Checker groups +------------------------------------------------ +Checker groups allow you to enable checkers that share a common prefix in +their names. Checkers within a group will have names that start with the same +identifier, making it easier to manage and reference related checkers. + +You can enable/disable checkers belonging to a group: '-e