Somewhat related to this, but it still doesn't quite answer my question
我有一个 C 项目,我想枚举所有未引用函数(包括非静态函数,因此为 werror=unused-function 设置编译器选项仅部分有效...)识别并清理代码库。
我想到的一种方法是枚举项目中的所有函数,然后编写一个脚本来遍历每个函数并查看它是否通过 cscope 调用...但我不确定如何获取列表形式首先是所有功能。上面的链接有一个对我来说失败的解决方案。
欢迎任何其他想法。
最佳答案
知道函数是否会被调用是一个不可判定的问题(类似于图灵机的停止问题)。由于您可以通过指针调用函数(因为它是通过回调完成的),所以在您实际从代码中取出函数并运行代码之前,您实际上无法确定是否会调用函数。
链接器仅链接代码中引用的函数,并且不知道它们是否属于不会被调用的死代码。
如果您想知道代码中所有引用的函数,只需在所有 .o 上
code> 文件,以获取所有 grep
nm(1)
命令的输出即可U
undefined reference (这是必须从外部链接到您的代码的函数列表)。这将列出对链接器必须解析的函数的所有外部引用。如果您的函数不存在,则该模块不会使用它。您可以将此列表与 .o
文件的外部函数列表(在 nm(1)
输出中标记为 T
的函数)进行匹配您想要检查的对象(或共享对象 .so
),并且您将看到(如链接器所做的那样)哪些对象已发布到链接器但未在代码中引用。三思而后行,因为这仅代表直接引用,您还必须管理间接引用(您的模块要求另一个模块中的函数,最终要求您要检查的函数)。
如果您的函数是静态
(仅文件可见性),只需用#if 0
指令包围函数定义,您就会得到该函数是否正在运行在某处引用。
我再说一遍,你无法轻易知道一个函数是否会在你的代码中被调用,你可以知道它是否在某个地方被引用。
我不知道您想通过这个问题来确定什么,但您可能会遇到 XY
问题实例(您提出的问题并不是您试图解决的问题)
顺便说一句,.h
头文件中定义的函数通常由开发人员声明为内联
,以优化函数调用/返回执行。因此,它们将在使用它们的地方内联,因此在链接时不会出现任何引用,因此您必须在代码中搜索它们(还有宏扩展的附加问题,因此您需要运行预处理器首先找到这些函数的引用)
关于C如何显示所有未使用的函数(包括h文件中定义的函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47293531/