From 1ef096cb7ba130d9d7b151ae96bcf31615cf8b42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20Umann?= Date: Thu, 26 Oct 2023 15:19:24 +0200 Subject: [PATCH] Fix a crash where analyzer binaries were absent AnalyzerContext keeps track of the binaries for each analyzer. However, if the binary isn't found, we don't map None to the respective analyzer, we simply skip it. This lead to key errors when we called the version getter function, which I fixed in this patch. --- analyzer/codechecker_analyzer/analyzer_context.py | 1 + analyzer/codechecker_analyzer/analyzers/clangsa/analyzer.py | 4 ++++ analyzer/codechecker_analyzer/analyzers/clangtidy/analyzer.py | 4 ++++ analyzer/codechecker_analyzer/analyzers/cppcheck/analyzer.py | 3 +++ analyzer/codechecker_analyzer/analyzers/gcc/analyzer.py | 3 +++ 5 files changed, 15 insertions(+) diff --git a/analyzer/codechecker_analyzer/analyzer_context.py b/analyzer/codechecker_analyzer/analyzer_context.py index 41fd167619..9ff3363011 100644 --- a/analyzer/codechecker_analyzer/analyzer_context.py +++ b/analyzer/codechecker_analyzer/analyzer_context.py @@ -220,6 +220,7 @@ def __populate_analyzers(self): if not compiler_binary: LOG.debug("'%s' binary can not be found in your PATH!", value) + self.__analyzers[name] = None continue self.__analyzers[name] = os.path.realpath(compiler_binary) diff --git a/analyzer/codechecker_analyzer/analyzers/clangsa/analyzer.py b/analyzer/codechecker_analyzer/analyzers/clangsa/analyzer.py index 02b32580fa..befcfb7e72 100644 --- a/analyzer/codechecker_analyzer/analyzers/clangsa/analyzer.py +++ b/analyzer/codechecker_analyzer/analyzers/clangsa/analyzer.py @@ -172,6 +172,10 @@ def __add_plugin_load_flags(cls, analyzer_cmd: List[str]): @classmethod def get_binary_version(self, environ, details=False) -> str: + # No need to LOG here, we will emit a warning later anyway. + if not self.analyzer_binary(): + return None + if details: version = [self.analyzer_binary(), '--version'] else: diff --git a/analyzer/codechecker_analyzer/analyzers/clangtidy/analyzer.py b/analyzer/codechecker_analyzer/analyzers/clangtidy/analyzer.py index 5d012750b5..4610823508 100644 --- a/analyzer/codechecker_analyzer/analyzers/clangtidy/analyzer.py +++ b/analyzer/codechecker_analyzer/analyzers/clangtidy/analyzer.py @@ -231,6 +231,10 @@ def analyzer_binary(cls): @classmethod def get_binary_version(self, environ, details=False) -> str: + # No need to LOG here, we will emit a warning later anyway. + if not self.analyzer_binary(): + return None + version = [self.analyzer_binary(), '--version'] try: output = subprocess.check_output(version, diff --git a/analyzer/codechecker_analyzer/analyzers/cppcheck/analyzer.py b/analyzer/codechecker_analyzer/analyzers/cppcheck/analyzer.py index c8cfbc535f..d4b9e6ad96 100644 --- a/analyzer/codechecker_analyzer/analyzers/cppcheck/analyzer.py +++ b/analyzer/codechecker_analyzer/analyzers/cppcheck/analyzer.py @@ -85,6 +85,9 @@ def analyzer_binary(cls): @classmethod def get_binary_version(self, environ, details=False) -> str: """ Get analyzer version information. """ + # No need to LOG here, we will emit a warning later anyway. + if not self.analyzer_binary(): + return None version = [self.analyzer_binary(), '--version'] try: output = subprocess.check_output(version, diff --git a/analyzer/codechecker_analyzer/analyzers/gcc/analyzer.py b/analyzer/codechecker_analyzer/analyzers/gcc/analyzer.py index 39c3c0ead3..00358e9724 100644 --- a/analyzer/codechecker_analyzer/analyzers/gcc/analyzer.py +++ b/analyzer/codechecker_analyzer/analyzers/gcc/analyzer.py @@ -173,6 +173,9 @@ def get_binary_version(self, environ, details=False) -> str: """ Return the analyzer version. """ + # No need to LOG here, we will emit a warning later anyway. + if not self.analyzer_binary(): + return None if details: version = [self.analyzer_binary(), '--version'] else: