Gcovr分支覆盖简单案例
Gcovr branch coverage for simple case
我开发了一个简单的例子来测试gcovr和gcov:
#include <iostream>
int main (int argc, const char * argv[])
{
std::cout << argc << std::endl;
if(argc == 1)
{
int y = 1;
std::cout << "Argc > 1" << std::endl;
}
if(argc == 2) std::cout << "Argc > 2" << std::endl;
if(argc == 3)
{
std::cout << "Argc > 3" << std::endl;
}
int i = 34;
i = i * i;
return 0;
}
以及用于生成覆盖率报告的脚本:
#! /bin/bash
rm -rf build-run
mkdir build-run
cd build-run
g++ -O6 -DDEBUG=0 --coverage -ftest-coverage -fprofile-arcs -c -o main.o ../main.cpp
g++ -O6 -DDEBUG=0 --coverage -fprofile-arcs -ftest-coverage -lgcov -o coverage ./main.o
./coverage > out
./coverage --help > out
./coverage --help --out > out
gcovr -v -kpbu -r .. -o ../branch-report.txt
gcovr -v -kpu -r .. -o ../report.txt
我使用-b选项获得了80%的覆盖率,它将我指向主块的最后一行。在我看来,这种情况是否应该是100%?
这是gcov的一个问题。如果您查看底层的gcov输出[示例驱动程序非常礼貌地将其作为build-run/^#main.cpp.gcov]留给我们,您会看到:
[…snip…]
3: 21: return 0;
function _Z41__static_initialization_and_destruction_0ii called 3 returned 100% blocks executed 100%
6: 22:}
branch 0 taken 3 (fallthrough)
branch 1 taken 0
branch 2 taken 3 (fallthrough)
branch 3 taken 0
function _GLOBAL__I_main called 3 returned 100% blocks executed 100%
3: 23:/*EOF*/
call 0 returned 3
我认为报告的是iostream库中对象的静态成员的析构函数的分支覆盖率…虽然我们试图通过gcovr过滤掉大部分gcov的怪异之处,但这是我们不能可靠地忽略的情况之一。
Bill HartJohn Siirola
附言:我鼓励您在gcovr-Trac页面上提交gcovr门票:https://software.sandia.gov/trac/fast/newticket
相关文章:
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 一种在C++中读取TXT配置文件的简单方法
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 显示错误输出的简单数组排序程序
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 退出简单while循环时出现问题
- 为什么简单的算术减法在"if"条件下不起作用?
- C++-字符串是否包含一个带有简单循环的单词
- 关于 c++ 函数中指针赋值的简单问题
- 从函数返回任意简单类型的数据
- 如何在没有函数的情况下编写此代码并使C++更简单?
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 谷歌模拟分割错误与简单的EXPECT_CALL案例
- C++简单的计算器(没有如果,开关,案例及其种类)
- Gcovr分支覆盖简单案例
- 一个简单的std::shared_ptr构造案例的段错误