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 |
|
1671 in 解析器实现
在cargo-cov中使用
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