You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
"""
解析 cppcheck XML 报告并生成摘要
"""
import xml.etree.ElementTree as ET
from pathlib import Path
from collections import Counter
import sys
def analyze_cppcheck_report(xml_path: Path):
"""分析 cppcheck XML 报告"""
if not xml_path.exists():
print(f"错误: 报告文件不存在: {xml_path}")
return
try:
tree = ET.parse(xml_path)
root = tree.getroot()
except Exception as e:
print(f"错误: 无法解析 XML 文件: {e}")
return
errors = root.findall(".//error")
total = len(errors)
if total == 0:
print("✓ 未检测到任何问题!")
return
# 统计信息
severity_count = Counter()
issue_type_count = Counter()
error_issues = []
for error in errors:
issue_id = error.get("id", "unknown")
severity = error.get("severity", "unknown")
severity_count[severity] += 1
issue_type_count[issue_id] += 1
if severity == "error":
msg = error.get("msg", "")
locations = error.findall("location")
if locations:
file_path = locations[0].get("file", "")
line = locations[0].get("line", "")
error_issues.append({
"id": issue_id,
"file": Path(file_path).name if file_path else "unknown",
"line": line,
"msg": msg[:60] + "..." if len(msg) > 60 else msg
})
# 打印摘要
print("=" * 60)
print("Cppcheck 测试结果摘要")
print("=" * 60)
print(f"\n总问题数: {total}")
print("\n按严重级别分类:")
for sev, count in sorted(severity_count.items(), key=lambda x: {"error": 0, "warning": 1, "style": 2, "information": 3, "note": 4}.get(x[0], 5)):
print(f" {sev:12s}: {count:3d}")
print("\n按问题类型分类前15:")
for issue_id, count in issue_type_count.most_common(15):
print(f" {issue_id:30s}: {count:3d}")
if error_issues:
print(f"\n严重错误详情Error级别{len(error_issues)} 个):")
for i, err in enumerate(error_issues[:10], 1):
print(f" {i}. [{err['id']}] {err['file']}:{err['line']}")
print(f" {err['msg']}")
if len(error_issues) > 10:
print(f" ... 还有 {len(error_issues) - 10} 个错误未显示")
print("\n" + "=" * 60)
print(f"报告文件: {xml_path}")
print("=" * 60)
if __name__ == "__main__":
if len(sys.argv) > 1:
report_path = Path(sys.argv[1])
else:
report_path = Path("/home/feng/test/cppcheck_report.xml")
analyze_cppcheck_report(report_path)