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

lam

与此有关,但仍然不能完全回答我的问题

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

我认为的一种方法是枚举项目中的所有功能,然后制作一个脚本来遍历每个功能,看看是否通过cscope调用了该脚本...但是我不确定如何获取所有这些功能的列表形式。首先发挥作用。上面的链接为我提供了一个失败的解决方案。

任何其他想法都欢迎。

路易斯·科罗拉多

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

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

如果您想知道代码中所有引用的函数,只需了解所有文件grepnm(1)命令输出.o,即可获取所有U未定义的引用(这是必须在外部链接到代码的函数的列表)。这将列出对链接器必须解析的函数的所有外部引用。如果您的功能不存在,则该模块不会使用它。您可以将此列表与要检查文件(或共享库的外部功能列表(Tnm(1)输出中标记为输出的功能)匹配.o.so),您会看到(就像链接器一样)发布到链接器中但未被您的代码引用的链接。请三思,因为这仅表示直接引用,因此您还必须管理间接引用(您的模块在另一个模块中要求一个功能,而最后一个模块要求您要检查的功能)。

如果您的函数是static(仅文件可见的),只需在#if 0指令周围加上函数定义,您将获得该函数是否在某处被引用的信息。

我再说一遍,您不容易知道函数是否会在您的代码中调用,您无法知道是否在某处引用了该函数。

我不知道您想用这个问题来识别什么,但是您可能会遇到XY问题实例(您要问的不是您要解决的问题)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在.h和.c文件中定义功能

使用awk如何合并2个文件(例如A和B)并执行左外部联接功能,并在两个文件中包括所有列

如何在xubuntu中添加“显示所有窗口”功能?

如何从JS中的文件导出所有功能?

如何使用宁静黄瓜运行所有功能文件

在pkgdown参考yaml中包括“所有其他功能”

如何显示功能的定义

如何显示Isabelle中的功能定义

子图功能未显示所有子图

链接器尝试包括所有未使用的功能和模板实例,即使具有功能级别的链接

c++ - 如何在文件中打印并使用c ++中具有相同功能的cout?

在目录中查找所有文件并列出其文件名的功能,但不包括路径,大小和类型?

我是否需要包括admin.initializeApp(); 在我所有的Firebase云功能文件(Typescript)中?

在一个.R文件中定义所有功能,然后从另一个.R文件中调用它们。如果可能的话如何?

包括具有try and catch功能的文件

如何在文件IO中成功使用删除功能-C

使用 R 在文件夹的所有文件中应用特定功能

使用 R 在文件夹的所有文件中应用特定功能

如何在phpstorm中查找具有功能的所有文件?

如何找到所有用户定义的(与扩展无关的功能)?

如何在合并提交中显示功能分支的所有单独提交?

如何在所有者绘制的ListView中还原突出显示功能

如何使用Chrome的文本片段功能突出显示字符串的所有实例?

如何将节点包中的功能应用于目录中的所有文件?

显示功能在vim中的所有位置的列表

GeoJSON-在表格中显示所有功能

哪里可以显示doxygen文档中的所有免费功能?

如何完全删除具有所有功能的 nodejs 模块,甚至包括 setInterval?

iCloud功能中未显示“使用默认容器”