def construct_config_handler(cls, args, context): handler = config_handler.ClangSAConfigHandler() handler.analyzer_plugins_dir = context.checker_plugin handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) handler.compiler_resource_dir = \ host_check.get_resource_dir(handler.analyzer_binary, context) handler.report_hash = args.report_hash \ if 'report_hash' in args else None check_env = get_check_env(context.path_env_extra, context.ld_lib_path_extra) if 'ctu_phases' in args: handler.ctu_dir = os.path.join(args.output_path, args.ctu_dir) handler.ctu_has_analyzer_display_ctu_progress = \ host_check.has_analyzer_feature( context.analyzer_binaries.get(cls.ANALYZER_NAME), '-analyzer-display-ctu-progress', check_env) handler.log_file = args.logfile handler.path_env_extra = context.path_env_extra handler.ld_lib_path_extra = context.ld_lib_path_extra try: with open(args.clangsa_args_cfg_file, 'rb') as sa_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', replace_env_var(args.clangsa_args_cfg_file), sa_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clangsa arguments file was given in the command line. LOG.debug_analyzer(aerr) checkers = ClangSA.get_analyzer_checkers(handler, check_env) # Read clang-sa checkers from the config file. clang_sa_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer( 'No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers(context.available_profiles, context.package_root, checkers, clang_sa_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler
def construct_config_handler(cls, args, context): handler = config_handler.ClangTidyConfigHandler() handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) # FIXME We cannot get the resource dir from the clang-tidy binary, # therefore we get a sibling clang binary which of clang-tidy. # TODO Support "clang-tidy -print-resource-dir" . check_env = env.extend(context.path_env_extra, context.ld_lib_path_extra) # Overwrite PATH to contain only the parent of the clang binary. if os.path.isabs(handler.analyzer_binary): check_env['PATH'] = os.path.dirname(handler.analyzer_binary) clang_bin = ClangSA.resolve_missing_binary('clang', check_env) handler.compiler_resource_dir = \ host_check.get_resource_dir(clang_bin, context) try: with open(args.tidy_args_cfg_file, 'rb') as tidy_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', env.replace_env_var, tidy_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy arguments file was given in the command line. LOG.debug_analyzer(aerr) try: # The config file dumped by clang-tidy contains "..." at the end. # This has to be emitted, otherwise -config flag of clang-tidy # cannot consume it. with open(args.tidy_config, 'rb') as tidy_config: lines = tidy_config.readlines() lines = filter(lambda x: x != '...\n', lines) handler.checker_config = ''.join(lines) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy config file was given in the command line. LOG.debug_analyzer(aerr) check_env = env.extend(context.path_env_extra, context.ld_lib_path_extra) checkers = ClangTidy.get_analyzer_checkers(handler, check_env) # Read clang-tidy checkers from the config file. clang_tidy_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer( 'No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers(context.available_profiles, context.package_root, checkers, clang_tidy_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler
def construct_config_handler(cls, args, context): handler = config_handler.ClangTidyConfigHandler() handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) handler.report_hash = args.report_hash \ if 'report_hash' in args else None # FIXME We cannot get the resource dir from the clang-tidy binary, # therefore we get a sibling clang binary which of clang-tidy. # TODO Support "clang-tidy -print-resource-dir" . check_env = env.extend(context.path_env_extra, context.ld_lib_path_extra) # Overwrite PATH to contain only the parent of the clang binary. if os.path.isabs(handler.analyzer_binary): check_env['PATH'] = os.path.dirname(handler.analyzer_binary) clang_bin = ClangSA.resolve_missing_binary('clang', check_env) handler.compiler_resource_dir = \ host_check.get_resource_dir(clang_bin, context) try: with open(args.tidy_args_cfg_file, 'r', encoding='utf-8', errors='ignore') as tidy_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', env.replace_env_var, tidy_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy arguments file was given in the command line. LOG.debug_analyzer(aerr) analyzer_config = {} # TODO: This extra "isinsrance" check is needed for # CodeChecker analyzers --analyzer-config. This command also # runs this function in order to construct a config handler. if 'analyzer_config' in args and \ isinstance(args.analyzer_config, list): r = re.compile(r'(?P<analyzer>.+?):(?P<key>.+?)=(?P<value>.+)') for cfg in args.analyzer_config: m = re.search(r, cfg) if m.group('analyzer') == cls.ANALYZER_NAME: analyzer_config[m.group('key')] = m.group('value') # TODO: This extra "isinsrance" check is needed for # CodeChecker checkers --checker-config. This command also # runs this function in order to construct a config handler. if 'checker_config' in args and \ isinstance(args.checker_config, list): r = re.compile(r'(?P<analyzer>.+?):(?P<key>.+?)=(?P<value>.+)') check_options = [] for cfg in args.checker_config: m = re.search(r, cfg) if m.group('analyzer') == cls.ANALYZER_NAME: check_options.append({ 'key': m.group('key'), 'value': m.group('value') }) analyzer_config['CheckOptions'] = check_options else: try: with open(args.tidy_config, 'r', encoding='utf-8', errors='ignore') as tidy_config: handler.checker_config = tidy_config.read() except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy config file was given in the command line. LOG.debug_analyzer(aerr) # 'take-config-from-directory' is a special option which let the user # to use the '.clang-tidy' config files. It will disable analyzer and # checker configuration options. if not handler.checker_config and \ analyzer_config.get('take-config-from-directory') != 'true': handler.checker_config = json.dumps(analyzer_config) check_env = env.extend(context.path_env_extra, context.ld_lib_path_extra) checkers = ClangTidy.get_analyzer_checkers(handler, check_env) # Read clang-tidy checkers from the config file. clang_tidy_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer( 'No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers(context.available_profiles, context.package_root, checkers, clang_tidy_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler
def construct_config_handler(cls, args, context): environ = env.extend(context.path_env_extra, context.ld_lib_path_extra) handler = config_handler.ClangSAConfigHandler(environ) handler.analyzer_plugins_dir = context.checker_plugin handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) handler.compiler_resource_dir = \ host_check.get_resource_dir(handler.analyzer_binary, context) handler.version_info = version.get(handler.analyzer_binary, environ) handler.report_hash = args.report_hash \ if 'report_hash' in args else None handler.enable_z3 = 'enable_z3' in args and args.enable_z3 == 'on' handler.enable_z3_refutation = 'enable_z3_refutation' in args and \ args.enable_z3_refutation == 'on' if 'ctu_phases' in args: handler.ctu_dir = os.path.join(args.output_path, args.ctu_dir) handler.log_file = args.logfile handler.path_env_extra = context.path_env_extra handler.ld_lib_path_extra = context.ld_lib_path_extra try: with open(args.clangsa_args_cfg_file, 'r', encoding='utf8', errors='ignore') as sa_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', env.replace_env_var(args.clangsa_args_cfg_file), sa_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clangsa arguments file was given in the command line. LOG.debug_analyzer(aerr) checkers = ClangSA.get_analyzer_checkers(handler, environ) # Read clang-sa checkers from the config file. clang_sa_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer( 'No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers(context.available_profiles, context.package_root, checkers, clang_sa_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) handler.checker_config = [] r = re.compile(r'(?P<analyzer>.+?):(?P<key>.+?)=(?P<value>.+)') # TODO: This extra "isinstance" check is needed for # CodeChecker checkers --checker-config. This command also runs # this function in order to construct a config handler. if 'checker_config' in args and \ isinstance(args.checker_config, list): for cfg in args.checker_config: m = re.search(r, cfg) if m.group('analyzer') == cls.ANALYZER_NAME: handler.checker_config.append( m.group('key') + '=' + m.group('value')) # TODO: This extra "isinstance" check is needed for # CodeChecker analyzers --analyzer-config. This command also runs # this function in order to construct a config handler. if 'analyzer_config' in args and \ isinstance(args.analyzer_config, list): for cfg in args.analyzer_config: m = re.search(r, cfg) if m.group('analyzer') == cls.ANALYZER_NAME: handler.checker_config.append( m.group('key') + '=' + m.group('value')) return handler
def construct_config_handler(cls, args, context): handler = config_handler.ClangSAConfigHandler() handler.analyzer_plugins_dir = context.checker_plugin handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) handler.compiler_resource_dir = \ host_check.get_resource_dir(handler.analyzer_binary, context) handler.report_hash = args.report_hash \ if 'report_hash' in args else None check_env = get_check_env(context.path_env_extra, context.ld_lib_path_extra) if 'ctu_phases' in args: handler.ctu_dir = os.path.join(args.output_path, args.ctu_dir) handler.ctu_has_analyzer_display_ctu_progress = \ host_check.has_analyzer_feature( context.analyzer_binaries.get(cls.ANALYZER_NAME), '-analyzer-display-ctu-progress', check_env) handler.log_file = args.logfile handler.path_env_extra = context.path_env_extra handler.ld_lib_path_extra = context.ld_lib_path_extra try: with open(args.clangsa_args_cfg_file, 'rb') as sa_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', replace_env_var(args.clangsa_args_cfg_file), sa_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clangsa arguments file was given in the command line. LOG.debug_analyzer(aerr) checkers = ClangSA.get_analyzer_checkers(handler, check_env) # Read clang-sa checkers from the config file. clang_sa_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer('No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers( context.available_profiles, context.package_root, checkers, clang_sa_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler
def construct_config_handler(cls, args, context): handler = config_handler.ClangTidyConfigHandler() handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) # FIXME We cannot get the resource dir from the clang-tidy binary, # therefore we get a sibling clang binary which of clang-tidy. # TODO Support "clang-tidy -print-resource-dir" . check_env = get_check_env(context.path_env_extra, context.ld_lib_path_extra) # Overwrite PATH to contain only the parent of the clang binary. if os.path.isabs(handler.analyzer_binary): check_env['PATH'] = os.path.dirname(handler.analyzer_binary) clang_bin = ClangSA.resolve_missing_binary('clang', check_env) handler.compiler_resource_dir = \ host_check.get_resource_dir(clang_bin, context) try: with open(args.tidy_args_cfg_file, 'rb') as tidy_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', replace_env_var, tidy_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy arguments file was given in the command line. LOG.debug_analyzer(aerr) try: # The config file dumped by clang-tidy contains "..." at the end. # This has to be emitted, otherwise -config flag of clang-tidy # cannot consume it. with open(args.tidy_config, 'rb') as tidy_config: lines = tidy_config.readlines() lines = filter(lambda x: x != '...\n', lines) handler.checker_config = ''.join(lines) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clang tidy config file was given in the command line. LOG.debug_analyzer(aerr) check_env = get_check_env(context.path_env_extra, context.ld_lib_path_extra) checkers = ClangTidy.get_analyzer_checkers(handler, check_env) # Read clang-tidy checkers from the config file. clang_tidy_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer('No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers( context.available_profiles, context.package_root, checkers, clang_tidy_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler
def construct_config_handler(cls, args, context): environ = env.extend(context.path_env_extra, context.ld_lib_path_extra) handler = config_handler.ClangSAConfigHandler(environ) handler.analyzer_plugins_dir = context.checker_plugin handler.analyzer_binary = context.analyzer_binaries.get( cls.ANALYZER_NAME) handler.compiler_resource_dir = \ host_check.get_resource_dir(handler.analyzer_binary, context) handler.version_info = version.get(handler.analyzer_binary, environ) handler.report_hash = args.report_hash \ if 'report_hash' in args else None handler.enable_z3 = 'enable_z3' in args and args.enable_z3 == 'on' handler.enable_z3_refutation = 'enable_z3_refutation' in args and \ args.enable_z3_refutation == 'on' if 'ctu_phases' in args: handler.ctu_dir = os.path.join(args.output_path, args.ctu_dir) handler.log_file = args.logfile handler.path_env_extra = context.path_env_extra handler.ld_lib_path_extra = context.ld_lib_path_extra try: with open(args.clangsa_args_cfg_file, 'r', encoding='utf8', errors='ignore') as sa_cfg: handler.analyzer_extra_arguments = \ re.sub(r'\$\((.*?)\)', env.replace_env_var(args.clangsa_args_cfg_file), sa_cfg.read().strip()) handler.analyzer_extra_arguments = \ shlex.split(handler.analyzer_extra_arguments) except IOError as ioerr: LOG.debug_analyzer(ioerr) except AttributeError as aerr: # No clangsa arguments file was given in the command line. LOG.debug_analyzer(aerr) checkers = ClangSA.get_analyzer_checkers(handler, environ) # Read clang-sa checkers from the config file. clang_sa_checkers = context.checker_config.get(cls.ANALYZER_NAME + '_checkers') try: cmdline_checkers = args.ordered_checkers except AttributeError: LOG.debug_analyzer( 'No checkers were defined in ' 'the command line for %s', cls.ANALYZER_NAME) cmdline_checkers = None handler.initialize_checkers(context.available_profiles, context.package_root, checkers, clang_sa_checkers, cmdline_checkers, 'enable_all' in args and args.enable_all) return handler