Somewhat related to this, but it still doesn't quite answer my question
我有一个C项目,我想枚举所有未引用的函数(包括非静态函数,因此为werror设置编译器选项= unused-function只能部分工作...)按顺序识别和清理代码库。
我想到的一种方法是枚举项目中的所有函数,然后制作一个脚本来查看每个函数并查看是否通过cscope调用...但我不知道如何获取列表表单首先是所有功能。上面的链接有一个失败的解决方案。
欢迎任何其他想法。
答案 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)需要对构建结构进行大量的返工(将这些工具所需的几百个文件放入一个命令行)。