Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C如何显示所有未使用的函数(包括在h文件中定义的函数)_C_Linux_Function_Cscope - Fatal编程技术网

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

C如何显示所有未使用的函数(包括在h文件中定义的函数),c,linux,function,cscope,C,Linux,Function,Cscope,我有一个C项目,我想列举所有未引用的函数(包括非静态函数,因此为werror=unused function设置编译器选项只能部分工作…),以便识别和清理代码库 我想到的一种方法是枚举项目中的所有函数,然后制作一个脚本来遍历每个函数,看看它是否通过cscope调用。。。但我不知道首先如何获得所有函数的列表形式。上面的链接有一个解决方案,但对我来说是失败的 欢迎提出任何其他想法 我会使用静态代码分析工具,例如。它是发现代码中潜在问题以及保持代码整洁的好工具,因为它可以配置为指出未使用的函数/变量等

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

我想到的一种方法是枚举项目中的所有函数,然后制作一个脚本来遍历每个函数,看看它是否通过cscope调用。。。但我不知道首先如何获得所有函数的列表形式。上面的链接有一个解决方案,但对我来说是失败的


欢迎提出任何其他想法

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


其他人建议这是一个免费的替代方案,但我没有使用它,因此我个人无法对此进行担保。

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

我在ncurses中这样做,以查看(自定义)脚本使用了哪些库符号,该脚本列出了从其库导出的符号,以及哪些库符号是(或不是)从与库链接的程序中使用的

脚本的输出是一个报告,它构成了文件的大部分


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

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

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

如果您想知道代码中所有引用的函数,只需对所有
.o
文件执行
nm(1)
命令的输出,即可获得所有
U
未定义的引用(这是必须从外部链接到代码的函数列表)。这将列出链接器必须解析的函数的所有外部引用。如果您的函数不存在,则该模块不使用该函数。您可以将此列表与要检查的
.o
文件(或共享对象
.so
)的外部函数列表(在
nm(1)
输出中标记为
T
的函数)相匹配,您将看到(与链接器一样)哪些函数已发布到链接器,但未在代码中引用。再三考虑,因为这只表示直接引用,您还必须管理间接引用(您的模块要求另一个模块中的函数,该函数最终要求您尝试检查的函数)

如果您的函数是
静态的
(仅文件可见性),只需用
#if 0
指令围绕函数定义,就可以得到函数是否在某处被引用

我重复一遍,你不可能很容易地知道一个函数是否会在你的代码中被调用,你可以知道它是否在某个地方被引用

我不知道你想对这个问题认同什么,但你可能会遇到
XY
问题实例(你问的不是你想解决的问题)


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

您可以尝试,它将为您提供代码库中所有未使用的函数。

上面的链接有一个解决方案对我来说是失败的-如何失败?编译器选项无法为具有外部链接的函数实现这一点,因为C对每个翻译单元都有单独的编译。仅仅因为(非
静态
)函数没有在声明它的给定翻译单元中调用,并不意味着没有其他TU在其中调用它。嗨,尤金,我得到了下面的错误:cscope-R-L-2“*”| awk-F“{print$2”#“$1}”| sort | uniq cscope:找不到文件。。cscope:找不到源文件,即使链接器对象也无法可靠地为动态对象执行此操作,因为在运行时之前,您不一定知道是否使用了给定的动态符号。嗯,我不知道该告诉您什么。这个命令对我有效。您显示的错误消息使我怀疑命令行上存在引用问题,但我在您所运行的命令中没有看到这样的问题。它不是NP完全的,是不可判定的。当然,应该尝试查找未使用的函数,而不是“未调用的”。@n.m.,这取决于您对未使用函数的理解。。。。你是对的。。。它是不可判定的,并且不是NP完全的。对于这个错误,我深表歉意。简单地说,如果您可以删除一个函数定义,并且仍然成功地构建程序,那么该函数是未使用的。@n.m.,这正是我的意思