在C ++代码中实例化模板

在C ++代码中找到未被证实的模板的最好方法是什么?

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

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

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

是否有任何“开箱即用”的功能允许我扩充由GCC -ftest-coverage -fprofile-arcs工具生成的文件? 通过GCC的gcov选项文档,将整个模板函数体标记为一个块可能就足够了,因为执行永远不会结束。

编辑 (背景信息):我正在研究仅头文件模板库。 我的目标是找到未使用/未经测试的功能。

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

查找无实际代码很重要,例如,由于C ++模板优先行为不直观,因此可能存在读者甚至作者期望使用的死代码。


我认为我们的C ++测试覆盖工具(不是基于GCC)从你的角度正确地做到了这一点。

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

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


好吧,由于我对GCC不太熟悉,这里有一个冗长而耗时的解决方案,但至少可以工作! :)
该测试依赖于以下事实:在实际实例化之前,即在从属名称实际上不存在于模板参数中时,才能检测到模板代码中的一些错误:

template<class T>
struct Example{
  typedef typename T::_123344_non_existent_type instantiation_test;
};

将这样的typedef添加到您拥有的每个模板中,然后编译。 从每个结构/类/函数中删除它,编译器显示错误,并且每个模板仍然包含这样的typedef,当代码最终编译时永远不会被实例化。 或者你很倒霉,有些类型可以定义这样一个_123344_non_existent_type ,尽管我会_123344_non_existent_type负责这个的同事。 ;)

链接地址: http://www.djcxy.com/p/6475.html

上一篇: instantiated templates in C++ code

下一篇: landscape mode in tablet only