def build_stat_coll_cmd(action, config, source, environ): """ Build the statistics collector analysis command. """ cmd = [config.analyzer_binary] cmd.append('-c') cmd.extend(['-x', action.lang]) # Do not warn about the unused gcc/g++ arguments. cmd.append('-Qunused-arguments') cmd.append('--analyze') for plugin in config.analyzer_plugins: cmd.extend([ "-Xclang", "-plugin", "-Xclang", "checkercfg", "-Xclang", "-load", "-Xclang", plugin ]) # Enable text only output for later parsing. analyzer_mode = 'text' cmd.extend([ '-Xclang', '-analyzer-opt-analyze-headers', '-Xclang', '-analyzer-output=' + analyzer_mode ]) cmd.append(config.analyzer_extra_arguments) cmd.extend(action.analyzer_options) # Enable the statistics collector checkers only. collector_checkers = [] for checker_name, _ in config.checks().items(): if SpecialReturnValueCollector.checker_collect in checker_name: collector_checkers.append(checker_name) if ReturnValueCollector.checker_collect in checker_name: collector_checkers.append(checker_name) if not collector_checkers: LOG.debug('No available statistics collector checkers were found') return [], False for coll_check in collector_checkers: cmd.extend(['-Xclang', '-analyzer-checker=' + coll_check]) if action.target != "": cmd.append("--target=" + action.target) extend_analyzer_cmd_with_resource_dir(cmd, config.compiler_resource_dir) cmd.extend(action.compiler_includes) if source: cmd.append(source) return cmd, True
def construct_analyzer_cmd(self, result_handler): """ """ try: config = self.config_handler analyzer_cmd = [config.analyzer_binary] # Disable all checkers by default. # The latest clang-tidy (3.9) release enables clang static analyzer # checkers by default. They must be disabled explicitly. # For clang compiler warnings a correspoding # clang-diagnostic error is generated by Clang tidy. # They can be disabled by this glob -clang-diagnostic-* checkers_cmdline = '-*,-clang-analyzer-*' # Config handler stores which checkers are enabled or disabled. for checker_name, value in config.checks().items(): enabled, _ = value if enabled: checkers_cmdline += ',' + checker_name else: checkers_cmdline += ',-' + checker_name analyzer_cmd.append("-checks='" + checkers_cmdline.lstrip(',') + "'") LOG.debug(config.analyzer_extra_arguments) analyzer_cmd.append(config.analyzer_extra_arguments) analyzer_cmd.append(self.source_file) analyzer_cmd.append("--") analyzer_cmd.append('-Qunused-arguments') # Set language. analyzer_cmd.extend(['-x', self.buildaction.lang]) if self.buildaction.target != "": analyzer_cmd.append("--target=" + self.buildaction.target) analyzer_cmd.extend(self.buildaction.analyzer_options) extend_analyzer_cmd_with_resource_dir(analyzer_cmd, config.compiler_resource_dir) analyzer_cmd.extend(self.buildaction.compiler_includes) return analyzer_cmd except Exception as ex: LOG.error(ex) return []
def get_compile_command(action, config, source='', output=''): """ Generate a standardized and cleaned compile command serving as a base for other operations. """ cmd = [config.analyzer_binary] extend_analyzer_cmd_with_resource_dir(cmd, config.compiler_resource_dir) cmd.extend(action.compiler_includes) cmd.append('-c') cmd.extend(['-x', action.lang]) cmd.append(config.analyzer_extra_arguments) cmd.extend(action.analyzer_options) if output: cmd.extend(['-o', output]) if source: cmd.append(source) return cmd
def construct_analyzer_cmd(self, result_handler): """ Called by the analyzer method. Construct the analyzer command. """ try: # Get an output file from the result handler. analyzer_output_file = result_handler.analyzer_result_file # Get the checkers list from the config_handler. # Checker order matters. config = self.config_handler analyzer_cmd = [config.analyzer_binary, '--analyze', # Do not warn about the unused gcc/g++ arguments. '-Qunused-arguments', # Turn off clang hardcoded checkers list. '--analyzer-no-default-checks'] for plugin in config.analyzer_plugins: analyzer_cmd.extend(["-Xclang", "-plugin", "-Xclang", "checkercfg", "-Xclang", "-load", "-Xclang", plugin]) analyzer_mode = 'plist-multi-file' analyzer_cmd.extend(['-Xclang', '-analyzer-opt-analyze-headers', '-Xclang', '-analyzer-output=' + analyzer_mode, '-o', analyzer_output_file]) # Checker configuration arguments needs to be set before # the checkers. if self.__checker_configs: for cfg in self.__checker_configs: analyzer_cmd.extend(cfg) # Config handler stores which checkers are enabled or disabled. for checker_name, value in config.checks().items(): enabled, _ = value if enabled: analyzer_cmd.extend(['-Xclang', '-analyzer-checker=' + checker_name]) else: analyzer_cmd.extend(['-Xclang', '-analyzer-disable-checker', '-Xclang', checker_name]) # Get analyzer notes as events from clang. analyzer_cmd.extend(['-Xclang', '-analyzer-config', '-Xclang', 'notes-as-events=true']) if config.ctu_dir and not self.__disable_ctu: analyzer_cmd.extend( ['-Xclang', '-analyzer-config', '-Xclang', 'experimental-enable-naive-ctu-analysis=true', '-Xclang', '-analyzer-config', '-Xclang', 'ctu-dir=' + self.get_ctu_dir()]) if config.ctu_has_analyzer_display_ctu_progress: analyzer_cmd.extend(['-Xclang', '-analyzer-display-ctu-progress']) # Set language. analyzer_cmd.extend(['-x', self.buildaction.lang]) if self.buildaction.target != "": analyzer_cmd.append("--target=" + self.buildaction.target) analyzer_cmd.append(config.analyzer_extra_arguments) analyzer_cmd.extend(self.buildaction.analyzer_options) extend_analyzer_cmd_with_resource_dir(analyzer_cmd, config.compiler_resource_dir) analyzer_cmd.extend(self.buildaction.compiler_includes) if not next((x for x in analyzer_cmd if x.startswith('-std=') or x.startswith('--std')), False): analyzer_cmd.append(self.buildaction.compiler_standard) analyzer_cmd.append(self.source_file) return analyzer_cmd except Exception as ex: LOG.error(ex) return []
def construct_analyzer_cmd(self, result_handler): """ Called by the analyzer method. Construct the analyzer command. """ try: # Get an output file from the result handler. analyzer_output_file = result_handler.analyzer_result_file # Get the checkers list from the config_handler. # Checker order matters. config = self.config_handler analyzer_cmd = [config.analyzer_binary] # Do not warn about the unused gcc/g++ arguments. analyzer_cmd.append('-Qunused-arguments') analyzer_cmd.append('--analyze') # Turn off clang hardcoded checkers list. analyzer_cmd.append('--analyzer-no-default-checks') for plugin in config.analyzer_plugins: analyzer_cmd.extend([ "-Xclang", "-plugin", "-Xclang", "checkercfg", "-Xclang", "-load", "-Xclang", plugin ]) analyzer_mode = 'plist-multi-file' analyzer_cmd.extend([ '-Xclang', '-analyzer-opt-analyze-headers', '-Xclang', '-analyzer-output=' + analyzer_mode ]) analyzer_cmd.extend(['-o', analyzer_output_file]) # Checker configuration arguments needs to be set before # the checkers. if self.__checker_configs: for cfg in self.__checker_configs: analyzer_cmd.extend(cfg) # Config handler stores which checkers are enabled or disabled. for checker_name, value in config.checks().items(): enabled, _ = value if enabled: analyzer_cmd.extend( ['-Xclang', '-analyzer-checker=' + checker_name]) else: analyzer_cmd.extend([ '-Xclang', '-analyzer-disable-checker', '-Xclang', checker_name ]) if config.ctu_dir and not self.__disable_ctu: # ctu-clang5 compatibility analyzer_cmd.extend([ '-Xclang', '-analyzer-config', '-Xclang', 'xtu-dir=' + self.get_ctu_dir() ]) # ctu-clang6 compatibility (5.0 and 6.0 options work together) analyzer_cmd.extend([ '-Xclang', '-analyzer-config', '-Xclang', 'experimental-enable-naive-ctu-analysis=true', '-Xclang', '-analyzer-config', '-Xclang', 'ctu-dir=' + self.get_ctu_dir() ]) if config.ctu_has_analyzer_display_ctu_progress: analyzer_cmd.extend( ['-Xclang', '-analyzer-display-ctu-progress']) if config.ctu_in_memory: analyzer_cmd.extend([ '-Xclang', '-analyzer-config', '-Xclang', 'xtu-reparse=' + os.path.abspath(config.log_file[0]) ]) # Set language. analyzer_cmd.extend(['-x', self.buildaction.lang]) if self.buildaction.target != "": analyzer_cmd.append("--target=" + self.buildaction.target) analyzer_cmd.append(config.analyzer_extra_arguments) analyzer_cmd.extend(self.buildaction.analyzer_options) extend_analyzer_cmd_with_resource_dir(analyzer_cmd, config.compiler_resource_dir) analyzer_cmd.extend(self.buildaction.compiler_includes) analyzer_cmd.append(self.source_file) return analyzer_cmd except Exception as ex: LOG.error(ex) return []
def construct_analyzer_cmd(self, result_handler): """ """ try: config = self.config_handler analyzer_cmd = [config.analyzer_binary] # Disable all checkers except compiler warnings by default. # The latest clang-tidy (3.9) release enables clang static analyzer # checkers by default. They must be disabled explicitly. # For clang compiler warnings a correspoding # clang-diagnostic error is generated by Clang tidy. # They can be disabled by this glob -clang-diagnostic-* checkers_cmdline = '-*,-clang-analyzer-*,clang-diagnostic-*' compiler_warnings = [] # Config handler stores which checkers are enabled or disabled. for checker_name, value in config.checks().items(): enabled, _ = value # Checker name is a compiler warning. if checker_name.startswith('W'): warning_name = checker_name[4:] if \ checker_name.startswith('Wno-') else checker_name[1:] if enabled: compiler_warnings.append('-W' + warning_name) else: compiler_warnings.append('-Wno-' + warning_name) continue if enabled: checkers_cmdline += ',' + checker_name else: checkers_cmdline += ',-' + checker_name analyzer_cmd.append("-checks='%s'" % checkers_cmdline.lstrip(',')) LOG.debug(config.analyzer_extra_arguments) analyzer_cmd.append(config.analyzer_extra_arguments) if config.checker_config: analyzer_cmd.append('-config="' + config.checker_config + '"') analyzer_cmd.append(self.source_file) analyzer_cmd.append("--") analyzer_cmd.append('-Qunused-arguments') # Enable these compiler warnings by default. analyzer_cmd.extend(['-Wall', '-Wextra']) # Set language. analyzer_cmd.extend(['-x', self.buildaction.lang]) if self.buildaction.target != "": analyzer_cmd.append("--target=" + self.buildaction.target) analyzer_cmd.extend(self.buildaction.analyzer_options) extend_analyzer_cmd_with_resource_dir(analyzer_cmd, config.compiler_resource_dir) analyzer_cmd.extend(self.buildaction.compiler_includes) if not next( (x for x in analyzer_cmd if x.startswith('-std=') or x.startswith('--std')), False): analyzer_cmd.append(self.buildaction.compiler_standard) analyzer_cmd.extend(compiler_warnings) return analyzer_cmd except Exception as ex: LOG.error(ex) return []