MCPcopy Index your code
hub / github.com/Tencent/CodeAnalysis / _run_misra_addon_analyze

Method _run_misra_addon_analyze

client/tool/cppcheck.py:37–121  ·  view source on GitHub ↗

cppcheck执行misra规则检查

(self, source_dir, params, files_path)

Source from the content-addressed store, hash-verified

35 self.sensitive_word_maps = {"cppcheck": "Tool", "Cppcheck": "Tool"}
36
37 def _run_misra_addon_analyze(self, source_dir, params, files_path):
38 """cppcheck执行misra规则检查
39 """
40 rules = params["rules"]
41 work_dir = params.work_dir
42 misra_rule_prefix = "misra-c2012-"
43 CPPCHECK_HOME = os.environ["CPPCHECK_HOME"]
44 find_all_rule_version_regex = r'Rule ([\.\d]+) [R|M|A]'
45 misra_rule_file = os.path.join(
46 CPPCHECK_HOME, "addons", "config", "misra_rules.txt")
47
48 # 获取需要检查的misra规则
49 misra_rules = [
50 rule for rule in rules if rule.startswith(misra_rule_prefix)]
51 LogPrinter.info(f"[misra_rules]: {misra_rules}")
52 if not misra_rules:
53 return []
54
55 # 其余的规则留给cppcheck进行检查
56 other_cppcheck_rules = list(set(rules) - set(misra_rules))
57 params["rules"] = other_cppcheck_rules
58
59 # all_rule_versions_set 所有的规则版本号
60 all_rule_versions_set = set(re.findall(
61 find_all_rule_version_regex, open(misra_rule_file, "r").read()))
62 LogPrinter.info(
63 f"[misra_rules_all_rule_versions_set]: {all_rule_versions_set}")
64
65 # disable_rule_version_set 需要关闭的规则版本号
66 disable_rule_version_set = all_rule_versions_set - \
67 set([rule[len(misra_rule_prefix):] for rule in rules])
68 LogPrinter.info(
69 f"[misra_rules_disable_rule_version_set]: {disable_rule_version_set}")
70
71 # 构造misra分析所需的配置文件
72 misra_config = {
73 "script": os.path.join(CPPCHECK_HOME, "addons", "misra.py"),
74 "args": [
75 f"--rule-text={misra_rule_file}"
76 ]
77 }
78 disable_rule_version_str = ','.join(list(disable_rule_version_set))
79 if disable_rule_version_str:
80 # 兼容全部规则启用的情况 ,不再需要 suppress-rules 参数
81 misra_config["args"].append(
82 f"--suppress-rules {disable_rule_version_str}")
83 LogPrinter.info(f"[misra_config] {misra_config}")
84
85 # 将配置写入到 misra.json 文件中,然后使用cppcheck --addon=<json file path> 指定配置
86 misra_file = os.path.join(work_dir, "misra.json")
87 with open(misra_file, "w") as f:
88 f.write(json.dumps(misra_config))
89
90 # 执行cppcheck misra 分析检查命令
91 cmd_args = [
92 "cppcheck",
93 f"--addon={misra_file}",
94 "--addon-python=python3",

Callers 1

analyzeMethod · 0.95

Calls 4

_format_resultMethod · 0.95
infoMethod · 0.45
readMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected