C如何显示所有未使用的函数(包括在h文件中定义的函数)

时间:2017-11-14 19:11:22

标签: c linux function cscope

Somewhat related to this, but it still doesn't quite answer my question

我有一个C项目,我想枚举所有未引用的函数(包括非静态函数,因此为werror设置编译器选项= unused-function只能部分工作...)按顺序识别和清理代码库。

我想到的一种方法是枚举项目中的所有函数,然后制作一个脚本来查看每个函数并查看是否通过cscope调用...但我不知道如何获取列表表单首先是所有功能。上面的链接有一个失败的解决方案。

欢迎任何其他想法。

5 个答案:

答案 0 :(得分:1)

知道是否会调用某个函数是一个不可判定的问题(类似于图灵机的停止问题)。正如您可以通过指针调用函数(因为它是由回调完成),您实际上无法确定是否将调用函数,直到您实际从代码中取出并运行代码。

链接器仅链接代码中引用的函数,并且不知道它们是否属于不会被调用的死代码。

如果您想了解代码中的所有引用函数,只需grep nm(1)所有.o文件的U命令输出,即可获得所有T未定义的引用(这是必须外部链接到代码的函数列表)。这将列出必须由链接器解析的函数的所有外部引用。如果您的功能不存在,那么该模块不会使用它。您可以将此列表与要检查的nm(1)文件的外部函数列表(.o中标记为.so的列表)(或共享对象{{1})匹配并且您将看到(作为链接器执行)哪些发布到链接器但未在代码中引用。三思,因为这只代表一个直接引用,你还必须管理间接引用(你的模块要求另一个模块中的一个函数,最后要求你试图检查的函数)。

如果你的函数是static(只有文件可见性),只需用#if 0指令包围函数定义,如果某个函数被引用,你就会得到。

我再说一遍,你不能轻易知道代码中是否会调用某个函数,你可以知道它是否在某处被引用。

我不知道你想用这个问题识别出什么,但是你可以遇到XY问题实例(你问的不是你试图解决的问题)

顺便说一句,开发人员通常会在.h头文件中定义函数inline来优化函数调用/返回执行。出于这个原因,它们将被内联使用它们,因此,它们在链接时没有引用它们,因此您必须在代码中搜索它们(添加了宏扩展的问题,因此您需要运行预处理器首先找到对这些函数的引用)

答案 1 :(得分:1)

您可以尝试CppDepend,它会为您提供代码库中所有未使用的功能。

答案 2 :(得分:0)

我会使用静态代码分析工具,例如lint。它是发现代码中潜在问题以及保持整洁的好工具,因为它可以配置为指出未使用的函数/变量/等。

其他人建议Cppcheck这是一个免费的选择,但我没有使用它,所以我不能亲自担保它。

答案 3 :(得分:0)

有g ++编译器选项可以删除未使用的代码,您可以使用符号表中的差异指向未使用的非虚拟方法。 虚拟方法由于被链接到vtable而被“使用”,即使它们从未被调用过,因此找到它们的唯一方法是通过覆盖工具或者lint。动态链接库方法是一个不同的问题,因为您应该只需要检查有限数量的已发布入口点。无论如何,您必须决定其他客户是否需要这些入口点。

答案 4 :(得分:0)

我在ncurses中执行此操作,以查看(自定义)脚本list-used.sh使用哪些符号,该脚本生成从其库中导出的符号列表以及哪些符号是使用(或不使用)与图书馆相关联的程序。

脚本的输出是一个报告,它构成了test/README文件的大部分内容。

在其他答案中,建议使用的工具(a)不可用或(b)需要对构建结构进行大量的返工(将这些工具所需的几百个文件放入一个命令行)。