c++ - 在 C++ 代码中查找非实例化模板

标签 c++ templates code-coverage gcov

在 C++ 代码中查找未实例化模板的最佳方法是什么?

我有一个大量使用模板的代码库。 当然,我们要确保测试覆盖率高。 对于所有使用的代码,使用 gcov 效果很好。

但是,gcov 将未使用的模板报告为不可执行。

谷歌搜索后,似乎没有办法强制 g++ 为这些模板发出代码(这只是合乎逻辑的,编译器应该如何猜测任何类型?) 似乎也没有办法让 gcov 将未实例化的模板代码识别为可运行代码。

是否有任何“开箱即用”的东西允许我扩充 GCC -ftest-coverage -fprofile-arcs 工具生成的文件?通过 gcov option documentation of GCC , 将整个模板函数主体标记为一个 block 可能就足够了,因为执行永远不会在那里结束。

编辑(背景信息):我正在开发一个只有标题的模板库。 我的目标是找到未使用/未测试的功能。

我知道代码覆盖率存在缺陷,但找到未实例化的代码是朝着更好的测试代码迈出的非常重要的一步。 目前,我们将检查点宏放在每个函数的开头。 在测试模式下,它们扩展为将一对 (file, line) 插入一组已通过检查点的全局代码。 运行测试后,我们手动读取所有文件并将到达的检查点与所有可用检查点的集合进行比较。

找到未实例化的代码很重要,例如,由于不直观的 C​​++ 模板优先级行为,读者甚至作者可能希望使用的某处有死代码。

最佳答案

我认为我们的 C++ Test Coverage工具(不是基于 GCC)从你的角度来看是正确的。

它在编译器看到它之前检测源代码;无论模板是否被使用,模板内的代码都会获得“覆盖探测”。该工具的测试覆盖显示部分知道所有探针的位置;如果未实例化模板代码,则显然无法执行,这就是将要报告的内容。您不必执行任何“自定义”宏插入或其他,呃,BS。

缺点是,如果你有一个由几个不同类型参数化的模板,并且为不同的实例化类型执行模板方法 m1 和 m2,你对 m1 和 m2 的覆盖率将是 100%(毕竟,你执行了检测模板).目前尚不清楚这是不好的;只是这是如何解释的。

关于c++ - 在 C++ 代码中查找非实例化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5783464/

相关文章:

c++ - 可以输出文件吗? (注意, "to"不是一个文件)

c++ - 具有数据成员语法的零成本属性

c++ - 使用模板参数时的交叉引用

c++ - 成员类模板的类模板实参推导

linux - 无法使用 genhtml 合并覆盖率数据

c++ - Yacc 语法产生不正确的终端

c++ 实现有界原始类型

C++模板,加载点的高效函数

python - 如果测试没有足够的 python 覆盖率,如何让 travis 失败

java - Sonar 在哪里存储测试结果?