查找未使用的函数声明的工具?

时间:2020-03-06 14:25:00  来源:igfitidea点击:

在重构一些旧代码时,我意识到一个特定的头文件自从.cpp文件中删除以来,就充满了函数的函数声明。有谁知道可以自动发现(和剥离)这些工具的工具?

解决方案

如果用Doxygen索引到代码,则可以从哪里看到每个函数的引用。但是,我们将必须浏览每个类(每个类1个HTML页面)并扫描没有指向它们的内容。

另外,我们可以使用ctags生成代码中所有功能的列表,然后使用objdump或者类似的工具获取.o文件中所有功能的列表,然后比较这些列表。但是,由于名称修改,这可能会带来问题。

我不认为这是有原因的,因为在某些实际的源代码树中没有主体的函数可能是在某些外部库中定义的。这只能通过创建一个脚本来完成,该脚本在标头中列出已声明的函数,并验证是否有时调用了这些函数。

我们可能会制作一个test.cpp文件来全部调用它们,链接器会将没有代码的代码标记为未解析,这样测试代码只需编译即可,而不必担心实际运行。

我有一个用于vim的C ++ ftplugin,它能够检查并报告不匹配的功能-vimmers,该ftplugin套件尚不易于安装。 ftplugin基于ctags结果(因此其启发式方法可以轻松地适应其他环境),对于内联函数,有时会出现误报。

HTH,

除了Doxygen(@Milan Babuskov),我们还可以查看编译器中是否对此有警告。例如。 gcc具有-Wunused-function用于静态功能; -fdump-ipa-cgraph。

我听说过有关PC-Lint的好消息,但我想它可能对满足需求而言是过大的。

可以对PC-lint进行专用调整:

我针对问题测试了以下代码:

void foo(int );

int main()
{
    return 0;
}
lint.bat test_unused.cpp

并得到以下结果:

============================================================

--- Module:   test_unused.cpp (C++)

    --- Wrap-up for Module: test_unused.cpp

Info 752: local declarator 'foo(int)' (line 2, file test_unused.cpp) not referenced
test_unused.cpp(2) : Info 830: Location cited in prior message

============================================================

因此,我们可以为自己的钱包传递警告号752:

lint.bat  -"e*"  +e752  test_unused.cpp

-e" *"将删除所有警告,而+ e752将打开此特定警告