微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

有点相关,但它仍然不完全回答我的问题

我有一个C项目,我想枚举所有@H_404_3@未被引用的函数包括非静态,所以设置编译器选项werror =未使用的函数只能部分工作…),以识别和清理代码库。

我认为的一种方法是枚举项目中的所有函数,然后使脚本遍历每个函数,看看它是否通过cscope调用…但我不知道如何获得所有的函数的列表formsfunction摆在首位。 上面的链接一个解决scheme,对我来说是失败的。

欢迎任何其他想法。

我应该在C中声明系统调用函数吗?

EL 5中/etc/init.d/functions中声明的含义

我如何从Windows上的DLL从DLL调用函数

分叉for循环澄清

如何在Windows上找出哪个.c文件包含R内部的.c函数

fork()如何返回两个值?

函数如何存储在内存中?

Linux中的setprogname

在Postgresql函数中使用参数运行系统命令

未使用的函数返回值会发生什么?

知道函数是否被调用一个不可判定的问题(类似于图灵机的停止问题)。 正如你可以通过指针调用一个函数(因为它是通过回调函数完成的),你实际上不能确定一个函数是否会被调用,直到你真的从代码中取出并运行代码

链接器@H_404_3@只链接代码@H_404_3@中引用的函数,不知道它们是否属于不会被调用的死代码

如果你想知道代码中的所有引用函数,只需在所有的.o文件中输入nm(1)命令来得到所有U未定义的引用(这是必须外部链接到的函数列表)你的代码)。 这将列出所有必须由链接器解析的函数的外部引用。 如果你的函数不在那里,那么它就不会被这个模块使用。 你可以将这个列表与在你想检查的.o文件(或者共享对象.so )中的外部函数(在nm(1)输出标记为T的那个)相匹配,你会看到(作为链接器)是哪些发布到链接器,但没有在您的代码中引用。 考虑一下,因为这只代表一个直接的参考,你还必须管理间接引用(你的模块要求在另一个模块中的函数,最后要求你正在检查的函数)。

如果你的函数是static (只有文件可见性),那么只需通过#if 0指令来包围函数定义,如果函数被引用到某个地方,你将会得到。

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

我不知道你想用这个问题来辨认什么,但是你可以碰到XY问题实例(你问的不是你想要解决的问题)

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

我会使用静态代码分析工具,如lint 。 这是一个很好的工具,可以发现代码中的潜在问题,并保持它的整洁,因为它可以配置为指出未使用的函数/变量/等等。

其他人提出Cppcheck这是一个免费的替代品,但我没有使用它,所以我不能亲自担保。

有g ++编译器选项可以删除未使用的代码,也可以使用符号表中的不同来指向未使用的非虚拟方法。 虚拟方法由于被链接到vtable中而被“使用”,即使它们从未被调用过,所以通过覆盖工具或者lint可以找到这些方法的唯一方法。 动态链接的库方法一个不同的问题,因为您应该只有有限数量的需要检查的已发布入口点。 无论如何,你必须决定是否有其他客户想要这些入口点。

我在ncurses中这样做,查看哪个库符号被一个自定义)脚本@H_404[email protected]使用,这个脚本列出了从它的库中导出的符号列表,以及哪些符号被用于(或不是)库。

脚本的输出是构成大部分@H_404_3@test/README文件的报告。

在其他答案中,有建议的工具可能(a)不可用,或(b)需要大量的构建结构的返工(按照这些工具的要求将几百个文件放入一个命令行)。

你可以试试CppDepend ,它会给你所有未使用的代码库的功能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐