我有一个C项目,我想枚举所有未引用的函数(包括非静态函数,因此为werror = unused-function设置编译器选项仅能部分起作用...)以便识别和清理代码库。
我认为的一种方法是枚举项目中的所有功能,然后制作一个脚本来遍历每个功能,看看是否通过cscope调用了该脚本...但是我不确定如何获取所有这些功能的列表形式。首先发挥作用。上面的链接为我提供了一个失败的解决方案。
任何其他想法都欢迎。
知道是否调用一个函数是一个无法确定的问题(类似于图灵机的停止问题)。因为您可以通过指针调用函数(因为它是通过回调完成的),所以您实际上无法确定是否会调用该函数,除非您实际从代码中将其取出并运行代码。
链接器仅链接代码中引用的函数,并且不知道它们是否属于不会被调用的无效代码。
如果您想知道代码中所有引用的函数,只需了解所有文件上grep
的nm(1)
命令输出.o
,即可获取所有U
未定义的引用(这是必须在外部链接到代码的函数的列表)。这将列出对链接器必须解析的函数的所有外部引用。如果您的功能不存在,则该模块不会使用它。您可以将此列表与要检查的文件(或共享库)的外部功能列表(T
在nm(1)
输出中标记为输出的功能)匹配.o
.so
),您会看到(就像链接器一样)发布到链接器中但未被您的代码引用的链接。请三思,因为这仅表示直接引用,因此您还必须管理间接引用(您的模块在另一个模块中要求一个功能,而最后一个模块要求您要检查的功能)。
如果您的函数是static
(仅文件可见的),只需在#if 0
指令周围加上函数定义,您将获得该函数是否在某处被引用的信息。
我再说一遍,您不容易知道函数是否会在您的代码中调用,您无法知道是否在某处引用了该函数。
我不知道您想用这个问题来识别什么,但是您可能会遇到XY
问题实例(您要问的不是您要解决的问题)
顺便说一下,开发人员.h
通常会声明头文件中定义的函数,inline
以优化函数的调用/返回执行。出于这个原因,它们将在使用它们的位置内联,因此,在链接上没有对其的引用,因此您必须在代码中进行搜索(存在被宏扩展的额外问题,因此您需要运行预处理器首先找到对这些功能的引用)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句