#覆盖率 #gcov #lcov

cov

纯Rust编写的GCNO/GCDA格式解析器和分析器

4个版本

使用旧的Rust 2015

0.0.5 2018年8月29日
0.0.4 2018年6月18日
0.0.2 2017年11月15日
0.0.1 2017年6月13日
0.0.0 2017年6月8日

1671 in 解析器实现


cargo-cov中使用

MIT许可协议

125KB
2.5K SLoC

cov是一个GCNO/GCDA解析器。GCNO/GCDA是由GCC和基于LLVM的编译器(包括rustc)产生的源代码覆盖率文件格式。

GCNO(gcov notes)文件在rustc使用-Z profile标志时创建。GCNO文件编码了程序中每个函数的结构,称为控制流图(CFG)。GCNO还包含CFG中每个节点的文件名和行号。

GCDA(gcov data)文件在运行带有-标志的代码程序时创建。对于CFG中的每个边,GCDA存储了该边被采取的次数。

结合GCDA中的统计数据和GCNO中的源信息,覆盖率工具可以生成分支覆盖率报告。

示例

GCNO和GCDA具有相似的格式,并使用相同的Reader类进行解析。结果是Gcov结构。复杂项目通常会产生多个GCNO和GCDA文件。可以将所有统计数据合并到一个单独的Graph类中进行分析。最后,可以从Graph派生出易于导出的Report结构,以便轻松创建人类可读的HTML报告或为第三方覆盖率收集服务生成数据。

典型用法如下

extern crate cov;
extern crate serde_json;
use cov::{Gcov, Graph, Interner, SerializeWithInterner};

let mut interner = Interner::default();
let mut graph = Graph::default();

// merge the coverage statistics.
// note: merge all gcno before gcda.
graph.merge(Gcov::open("test-data/trivial.clang/x.gcno", &mut interner)?)?;
graph.merge(Gcov::open("test-data/trivial.rustc/x.gcno", &mut interner)?)?;

graph.merge(Gcov::open("test-data/trivial.clang/x.gcda", &mut interner)?)?;
graph.merge(Gcov::open("test-data/trivial.rustc/x.gcda", &mut interner)?)?;

// analyze the graph (if you skip this step, the report will be empty)
graph.analyze();

// produce the report.
let report = graph.report();

// serialize the report into json.
println!("{}", serde_json::to_string_pretty(&report.with_interner(&interner))?);

依赖关系

~2.3–3MB
~58K SLoC