Man*_*uel 8 c++ templates code-coverage gcov
在C++代码中查找未实例化模板的最佳方法是什么?
我有一个大量使用模板的代码库.当然,我们希望确保测试覆盖率很高.对于所有使用的代码,这非常有效gcov.
但是,未使用的模板将报告为不可执行的gcov.
经过一些谷歌搜索,似乎没有办法强制g++发出这些模板的代码(这只是逻辑,编译器应该如何猜测任何类型?)似乎也没有办法让gcov识别未实例化的模板代码作为可运行的代码.
有没有"开箱即用"的东西可以让我增加GCC -ftest-coverage -fprofile-arcs仪器生成的文件?通过GCC的gcov选项文档,将整个模板函数体标记为一个块可能就足够了,因为执行永远不会在那里结束.
编辑(背景信息):我正在开发一个仅限标题的模板库.我的目标是找到未使用/未经测试的功能.
我知道代码覆盖是有缺陷的,但找到未经实例化的代码是迈向更好测试代码的非常重要的一步.目前,我们将检查点宏放在每个函数的开头.在测试模式中,它们扩展为将一对(file, line)插入全局传递检查点的代码.运行测试后,我们手动读取所有文件,并将到达的检查点与所有可用检查点的集合进行比较.
查找未实例化的代码很重要,例如,由于不直观的C++模板优先级行为,可能存在读者甚至作者期望使用的死代码.
好吧,因为我不太熟悉 GCC,所以这是一个乏味且非常耗时的解决方案,但至少它有效!:)
这个测试依赖于这样一个事实,即模板代码中的一些错误直到实际实例化才被检测到,即当依赖名称实际上不存在于模板参数中时:
template<class T>
struct Example{
typedef typename T::_123344_non_existent_type instantiation_test;
};
Run Code Online (Sandbox Code Playgroud)
将这样的 typedef 添加到您拥有的每个模板中,然后编译。从编译器显示错误的每个结构/类/函数中删除它,并且当代码最终编译时仍然包含此类 typedef 的每个模板永远不会被实例化。或者你很不幸,某些类型确实定义了这样的 a _123344_non_existent_type,尽管我会用私刑处死负责的同事。;)