在重构一些旧代码时,我意识到一个特定的头文件充满了函数的函数声明,这些函数早已从 .cpp 文件中删除。有谁知道可以自动找到(并剥离)这些的工具?
7 回答
如果可能的话,你可以创建一个 test.cpp 文件来调用它们,链接器会将没有代码的那些标记为未解析,这样你的测试代码只需要编译而不用担心实际运行。
PC-lint 可以针对专用目的进行调整:
我针对您的问题测试了以下代码:
void foo(int );
int main()
{
return 0;
}
lint.bat test_unused.cpp
并得到以下结果:
==================================================== ========== --- 模块:test_unused.cpp (C++) --- 模块总结:test_unused.cpp 信息 752:未引用本地声明符 'foo(int)'(第 2 行,文件 test_unused.cpp) test_unused.cpp(2) :信息 830:先前消息中引用的位置 ==================================================== ==========
因此,您可以为您的目的传递警告编号 752:
lint.bat -"e*" +e752 test_unused.cpp
-e"*" 将删除所有警告,+e752 将打开此特定警告
如果您使用 Doxygen 对代码进行索引,您可以看到每个函数引用的位置。但是,您必须浏览每个类(每个类 1 个 HTML 页面)并扫描那些没有任何指向它们的内容。
或者,您可以使用 ctags 生成代码中所有函数的列表,然后使用 objdump 或其他类似工具获取 .o 文件中所有函数的列表 - 然后比较这些列表。但是,由于名称修改,这可能会出现问题。
我不认为有这样的事情,因为某些在实际源代码树中没有主体的函数可能是在某个外部库中定义的。这只能通过创建一个脚本来完成,该脚本在标题中列出声明的函数并验证它们是否有时被调用。
我有一个用于 vim 的 C++ ftplugin,它能够检查和报告不匹配的功能—— vimers,ftplugin 套件还不是很容易安装。ftplugin 基于 ctags 结果(因此它的启发式可以很容易地适应其他环境),有时在内联函数的情况下会出现误报。
高温下,
除了 Doxygen (@Milan Babuskov),您可以查看编译器中是否有警告。例如 gcc 有 -Wunused-function 用于静态函数;-fdump-ipa-cgraph。
我听说过有关PC-Lint 的好消息,但我想这可能对您的需求来说有点过头了。