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

标签 c linux function cscope

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

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

我想到的一种方法是枚举项目中的所有函数,然后编写一个脚本来遍历每个函数并查看它是否通过 cscope 调用...但我不确定如何获取列表形式首先是所有功能。上面的链接有一个对我来说失败的解决方案。

欢迎任何其他想法。

最佳答案

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

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

如果您想知道代码中所有引用的函数,只需在所有 .o 上grep nm(1) 命令的输出即可 code> 文件,以获取所有 U undefined reference (这是必须从外部链接到您的代码的函数列表)。这将列出对链接器必须解析的函数的所有外部引用。如果您的函数不存在,则该模块不会使用它。您可以将此列表与 .o 文件的外部函数列表(在 nm(1) 输出中标记为 T 的函数)进行匹配您想要检查的对象(或共享对象 .so),并且您将看到(如链接器所做的那样)哪些对象已发布到链接器但未在代码中引用。三思而后行,因为这仅代表直接引用,您还必须管理间接引用(您的模块要求另一个模块中的函数,最终要求您要检查的函数)。

如果您的函数是静态(仅文件可见性),只需用#if 0指令包围函数定义,您就会得到该函数是否正在运行在某处引用。

我再说一遍,你无法轻易知道一个函数是否会在你的代码中被调用,你可以知道它是否在某个地方被引用。

我不知道您想通过这个问题来确定什么,但您可能会遇到 XY 问题实例(您提出的问题并不是您试图解决的问题)

顺便说一句,.h 头文件中定义的函数通常由开发人员声明为内联,以优化函数调用/返回执行。因此,它们将在使用它们的地方内联,因此在链接时不会出现任何引用,因此您必须在代码中搜索它们(还有宏扩展的附加问题,因此您需要运行预处理器首先找到这些函数的引用)

关于C如何显示所有未使用的函数(包括h文件中定义的函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47293531/

相关文章:

linux - Linux/Unix下的wxCriticalSection

linux - 如何通过 `/dev` 列出的总线号和设备号找到 `lsusb` 中的设备文件?

Linux 在一行中搜索一个字符串,但替换该行中的另一个字符串

c++ - 接受指向同一类中私有(private)成员的指针的私有(private)成员函数

python - 我的 if 语句不断为空列表返回 'None'

Javascript:参数函数

c - 在 C 中创建自定义 .txt 文件名时出现问题

c - 是“长 : 16byte on my system?

c - 如何在 Arduino 软件 (1.6.5) 中#include <termios.h>?

c - 如何在 C (linux) 中挂起/重启进程