从coverage报告中删除自动生成的异常代码

时间:2017-09-22 14:32:39

标签: c++ gcc code-coverage gcov gcovr

让我们从最小的工作示例开始:
main.cpp中:

#include <iostream>
#include <string>

int main() {
    std::cout << "hello " + std::to_string(42);
    return 0;
}

我使用以下标志编译此代码:

[g++/clang++] -std=c++11 -g -Og --coverage -Wall -o main main.cpp
铿锵4.0.1
gcc 4.8.5。

我只得到50%的代码覆盖率,因为编译器生成的异常代码没有被执行,如in another stackoverflow question所述。

问题是通过-fno-exceptions禁用例外对我来说不是一个选择。我正在编写的代码单元测试使用异常,因此禁用所有这些代码不是一种选择。

为了使用gcovr生成报告,如果clang ++另外llvm-cov gcov转换它。但是我不受这些工具的约束,所以如果你有其他工具没有显示这种行为,请建议它们!

基本上我需要一种方法来编译/编写此代码的单元测试,并在启用异常的情况下获得100%分支/条件覆盖。有办法吗?

1 个答案:

答案 0 :(得分:1)

嗯,我相信你的意图实际上不是测试这段小代码,而是在项目中使用这个概念...

您输入的代码会抛出异常 - 如果您没有内存来存储将使用bad_alloc创建的字符串,则会引发std::to_string。为了100%安全,std::to_string应该被try-catch包围,您可以在那里处理异常。

要构建100%代码覆盖率单元测试,您需要强制执行异常 - 在这种特定情况下几乎不可能保证,因为参数是常数。但是,在您的项目中,您可能要分配一些大小可变的数据 - 在这种情况下,您可以在代码中隔离分配内存的方法,以单独测试它们。然后在测试函数中传递给这些方法,分配大量资金来评估你在catch块上放置的内容(并检查你是否正确处理它)。

例如,此代码应抛出异常,您可以在构建测试时使用它来激励自己(source):

// bad_alloc.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;

int main() {
   char* ptr;
   try {
      ptr = new char[(~unsigned int((int)0)/2) - 1];
      delete[] ptr;
   }
   catch( bad_alloc &ba) {
      cout << ba.what( ) << endl;
   }
}

但是,如果您不打算在代码中处理所有bad_alloc例外(或绝对所有例外),则无法获得100%的覆盖率 - 因为它不会100%覆盖..但是,大多数情况下,真正的100%覆盖是不必要的。