试用gcov

今天学了一下如何用gcov测试test suite的coverage。我最近在练习写一些算法,然后就在想如何能设计好的测试用例快速、全面的把我的算法测一遍。比如拿排序来说,找一个长度为n的数组,让它的每个元素的取值范围都在[1,n]之间,然后把所有的这样的可能性全部列出来,调用我的排序算法,再和std::sort的结果做对比。把数组长度从1到7的,符合上述要求的数组,全测一遍。够吗?对吗? 不一定啊… 比如我在写qsort的时候,只有当数组长度大于7的时候才会打开median3优化。

于是,我很需要一个简单的工具告诉我,我现在的test suite的代码覆盖率是多少。那么最古典的工具就是gconv。当编译、链接C/C++代码的时候,加上--coverage ,如

CC=/usr/local/bin/clang
CXX=/usr/local/bin/clang++
CXXFLAGS=-g3 -nostdinc++ -I/usr/local/lib/c++/v1 -std=c++11 -stdlib=libc++ -Wall -Wextra -fsanitize=address-full -fno-omit-frame-pointer --coverage
LDFLAGS=-g3 -fsanitize=address-full -fno-omit-frame-pointer --coverage
LIBS=-ltbb\_debug -lc++ -L/usr/local/lib -lglog

all: t

.cpp.o:
    $(CXX) $(CXXFLAGS) -c -o $@ $\<

t:test.o
    $(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)

然后执行我的测试程序 ./t

就会得到对应的gcda文件。然后调用gcov

$ gcov test.cpp
File 'test.cpp'
Lines executed:93.33% of 45
test.cpp:creating 'test.cpp.gcov'

....

它会生成一个test.cpp.gcov文件。

- : 6 :
 - : 7 :
 26: 8: int start = 0;
 26: 9: int end = a.size();
 56: 10: if (a.at(0) \> num || a.at(a.size() - 1) \< num) return -1;
 64: 11: while (start \<= end) {
 44: 12: int mid = (start + end) / 2;
 - : 13:
 44: 14: if (num == a.at(mid)) {
 20: 15: return mid;
 - : 16: }
 - : 17:
 24: 18: if (num \< a.at(mid)) {
 14: 19: end = mid - 1;
 14: 20: } else {
 10: 21: start = mid + 1;
 - : 22: }
 94: 23: }
 - : 24:
 #####: 25: return -1;
 26: 26:}

凡是以#####开头的行,就是没有被执行到的。

这东西要是有一个图形化的工具就好了,不然用起来真麻烦。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥