"""覆盖率比较 — 静态覆盖率 vs 动态覆盖率差异分析。""" from __future__ import annotations from typing import Any def compare_coverage( program_name: str, static: dict[str, Any], dynamic: dict[str, Any], ) -> dict[str, Any]: """比较静态覆盖率和动态覆盖率之间的差异。 静态覆盖率: 基于源码结构分析的理论覆盖范围。 动态覆盖率: 基于 gcov 实际执行数据的覆盖范围。 Args: program_name: 程序名称 static: 静态覆盖率数据 {"branch_rate": float, "paragraph_rate": float, "total_branches": int, "covered_branches": int, ...} dynamic: 动态覆盖率数据 {"gcov_cov": float, "covered_branches": int, "total_branches": int, "misleading_branches": list, ...} Returns: dict: { "program": str, # 程序名称 "static": {"branch_rate": float, "paragraph_rate": float}, "dynamic": {"gcov_cov": float}, "gap": float, # static - dynamic 的差异 "misleading_branches": list, # 可能导致误导的分支列表 } """ static_branch_rate = static.get("branch_rate", 0.0) static_para_rate = static.get("paragraph_rate", 0.0) dynamic_cov = dynamic.get("gcov_cov", 0.0) # 静态综合覆盖率 static_combined = static_branch_rate * 0.5 + static_para_rate * 0.5 # 差距: 静态覆盖率 - 动态覆盖率 gap = round(static_combined - dynamic_cov, 4) # 误导性分支: 静态认为已覆盖但动态未覆盖的分支 misleading_branches = dynamic.get("misleading_branches", []) return { "program": program_name, "static": { "branch_rate": static_branch_rate, "paragraph_rate": static_para_rate, }, "dynamic": { "gcov_cov": dynamic_cov, }, "gap": gap, "misleading_branches": misleading_branches, }