You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KLEE符号执行是否支持gcov?如何聚合多次执行的代码覆盖率?

问题

尝试从KLEE执行过程中获取代码覆盖率信息,想确认KLEE是否支持gcov工具。已知KLEE会在istats文件中提供通用覆盖率信息,但需要合并多次执行的覆盖率以得到总覆盖率。

程序包含两个文件,编译及链接命令如下(仅关注test_program.c的覆盖率):

clang-9 -I$KLEE_HOME/include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone --coverage test_program.c

clang-9 -I$KLEE_HOME/include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone utility_program.c

llvm-link-9 test_program.bc utility_program.bc -o target_file.bc

执行KLEE的命令:

klee --libc=uclibc --posix-runtime --only-output-states-covering-new --external-calls=all target_file.bc

运行时出现报错:

KLEE: WARNING: undefined reference to function: llvm_gcda_emit_arcs
KLEE: WARNING: undefined reference to function: llvm_gcda_emit_function
KLEE: WARNING: undefined reference to function: llvm_gcda_end_file
KLEE: WARNING: undefined reference to function: llvm_gcda_start_file
KLEE: WARNING: undefined reference to function: llvm_gcda_summary_info
KLEE: WARNING: undefined reference to function: llvm_gcov_init
KLEE: WARNING ONCE: calling external: llvm_gcov_init(94767398774408, 94767398772872) at [no debug info]
KLEE: ERROR: (location information missing) failed external call: llvm_gcov_init

请问是否可在KLEE中使用gcov?若不行,KLEE是否提供工具来聚合多次执行的覆盖率?


解答

关于KLEE对gcov的支持

KLEE不原生支持gcov,你遇到的报错正是因为KLEE的运行时环境未实现gcov依赖的llvm_gcov_init、llvm_gcda_*等底层函数。这些函数是gcov收集覆盖率数据的核心,而KLEE的uclibc/posix runtime并未包含相关实现,因此直接用--coverage编译后交给KLEE执行会触发未定义引用错误。

聚合多次KLEE执行覆盖率的方案

KLEE自带工具可处理多次执行的覆盖率合并,具体方式如下:

1. 使用klee-stats聚合istats数据

每次KLEE执行生成的istats文件记录了单轮执行的覆盖率(指令覆盖、分支覆盖等)。通过klee-stats可批量分析多个KLEE输出目录,自动计算总覆盖率:

klee-stats --table --merge <klee-output-dir-1> <klee-output-dir-2> ...

该命令会汇总所有目录的覆盖率数据,输出合并后的统计结果。

2. 使用klee-coverage生成源代码级覆盖率报告

若需要直观的源代码标记覆盖率,可使用klee-coverage:

  • 确保编译LLVM字节码时保留调试信息(你已添加-g参数,满足要求)
  • 收集所有KLEE执行生成的.ktest测试用例
  • 运行工具生成合并报告:
klee-coverage --object-file=target_file.bc --tests-dir=<all-ktests-dir>

工具会基于所有测试用例重新执行,输出类似gcov的源代码覆盖率标记结果。

3. 手动解析istats文件自定义合并

若需自定义统计逻辑,可手动解析每个istats文件(JSON格式),提取instructions_covered、total_instructions等字段,计算总覆盖率:

  • 总覆盖指令数 = 各轮执行覆盖指令数的并集大小(不可直接累加,避免重复计算)
  • 总覆盖率 = 总覆盖指令数 / 总指令数

内容的提问来源于stack exchange,提问作者fabCic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:56:05