fix: gcov Windows本地化 + runner合并 + 决策覆盖率修复

- gcov从WSL 15.2改为Windows MinGW 9.2.0,消除.gcno格式不匹配
- coverage.py去除leaf_stats复位bug(决策覆盖率恢复)
- runner.py合并V3编译+SOURCE分组执行+出力保存
- __init__.py gcov条件/outdir解析修复
This commit is contained in:
hangshuo652
2026-07-02 21:26:51 +08:00
parent b3d1643220
commit 40e8a50ab4
6 changed files with 635 additions and 21 deletions
+19 -11
View File
@@ -18,7 +18,7 @@ def parse_cbl_gcov(gcov_path: str) -> dict[int, int]:
-: 17: 源码行 → 不可执行(注释/声明行,跳过)
"""
counts = {}
with open(gcov_path, encoding='utf-8') as f:
with open(gcov_path, encoding='utf-8', errors='replace') as f:
for line in f:
m = re.match(r'^\s*(#####|\d+\*?|-):\s*(\d+):', line)
if not m:
@@ -35,7 +35,10 @@ def parse_cbl_gcov(gcov_path: str) -> dict[int, int]:
def run_gcov(program_name: str, work_dir: str) -> dict[int, int]:
"""在 work_dir 中通过 WSL 执行 gcov 并解析 COBOL 行计数。
"""在 work_dir 中执行 gcov 并解析 COBOL 行计数。
使用 Windows 本地的 gcov(与 GnuCOBOL 内置 MinGW 同版本)。
不要通过 WSL 调用 gcov,否则 .gcno/.gcda 版本不匹配。
Args:
program_name: 程序名(不含扩展名),如 "ALLCMDS"
@@ -44,21 +47,26 @@ def run_gcov(program_name: str, work_dir: str) -> dict[int, int]:
Returns:
{COBOL行号: 执行次数} 字典。失败时返回空 dict。
"""
wsl_work = _wsl_path(work_dir)
cmd = ['wsl', 'sh', '-c', f'cd {wsl_work} && gcov {program_name}.c']
result = subprocess.run(
cmd,
capture_output=True, text=True,
encoding='utf-8', errors='replace',
timeout=30,
)
try:
result = subprocess.run(
['gcov', f'{program_name}.cbl'],
capture_output=True, text=True,
encoding='utf-8', errors='replace',
timeout=30,
cwd=work_dir,
)
except FileNotFoundError:
logger.warning("gcov 命令未找到(未安装 MinGW gcov 或不在 PATH 中)")
return {}
if result.returncode != 0:
logger.warning(f"gcov 失败 (exit={result.returncode}): {result.stderr.strip()}")
return {}
cbl_gcov = Path(work_dir) / f'{program_name}.cbl.gcov'
if not cbl_gcov.exists():
logger.warning(f"gcov 输出不存在: {cbl_gcov}")
cbl_gcov = Path(work_dir) / f'{program_name}.gcov'
if not cbl_gcov.exists():
logger.warning(f"gcov 输出不存在 (tried .cbl.gcov / .gcov)")
return {}
gcov_data = parse_cbl_gcov(str(cbl_gcov))