Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
    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 []
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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 []
Ejemplo n.º 5
0
    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 []
Ejemplo n.º 6
0
    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 []