有没有办法得到关于未使用功能的警告?

Tim*_*nes 45 c gcc gcc-warning

我想在代码库中找到未使用的函数 - 包括编译单元.我正在使用gcc作为我的编译器.

这是一个例子:

foo.c(假设合适foo.h):

void foo() {
   ....
}

void bar() {
   ....
}
Run Code Online (Sandbox Code Playgroud)

main.c:

#include <stdio.h>
#include "foo.h"  

int main(void)  {
    bar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想得到关于foo()不被使用的警告.

-Wunused-functiongcc选项:

-Wunused-function

每当声明静态函数但未定义静态函数或未使用非内联静态函数时发出警告.-Wall启用此警告.

但它只适用于静态函数 - 它不会在上面的例子中产生警告.

我也接受可以为我做这个的工具/脚本/其他编译器的建议 - 尽管gcc如果可能的话我宁愿坚持下去.

Cor*_*ren 43

LibreOffice开发人员Caolan Mc Namara在LibreOffice源代码中提供了一个小工具来检测这种类型的东西.他们拥有LibreOffice中未使用的数千种功能和方法.他的工具是移除它们的关键因素.

它叫做callcatcher.它可以

收集定义的函数/方法并减去被调用/引用

它直接在汇编器输出上工作,因此,它仅适用于x86和x86_64架构.它可以产生输出像这样.您可以将它与传统的编译和链接调用集成到gcc中.

Caolan同意它应该成为一个gcc插件.

  • 太精彩了.为了您的娱乐价值,我正在工作的项目有**1257个未使用的功能**.我的印象是这个代码库中可能有不止一些...... (4认同)

eya*_*alm 6

我知道你要求警告并且不喜欢使用 gcc 选项,但这真的很容易。

您可以使用链接器优化 (--gc-sections) 来从应用程序中删除死代码。

从 gcc 的手册页:

--gc-sections --no-gc-sections 启用未使用的输入节的垃圾收集。它在不支持此选项的目标上被忽略。默认行为(不执行此垃圾收集)可以通过在命令行上指定 --no-gc-sections 来恢复。

--gc-sections通过检查符号和重定位来决定使用哪些输入节。包含入口符号的部分和包含命令行上未定义符号的所有部分将被保留,包含动态对象引用的符号的部分也将保留。请注意,在构建共享库时,链接器必须假定引用了任何可见符号。一旦确定了这组初始段,链接器就会递归地将其重定位引用的任何段标记为已使用。请参阅--entry 和--undefined。

执行部分链接时可以设置此选项(使用选项 -r 启用)。在这种情况下,必须通过 --entry 或 --undefined 选项或链接描述文件中的“ENTRY”命令明确指定保留符号的根。

  • 如果我没记错的话,有一个详细选项可以打印由 gc-sections 完成的优化列表。我认为它是“--print-gc-sections” (8认同)
  • 可悲的是,我不想从二进制文件中删除代码 - 我想找出源代码的哪些部分可以清理 (5认同)

小智 6

将 gcc 选项添加-ffunction-sections到您的编译和--gc-sections链接--print-gc-sections命令中。如果您通过 gcc 调用链接器,请使用-Wl,--gc-sections,--print-gc-sections将它们传递给 ld。

这将删除您所说不想要的未使用的目标代码。在这种情况下,--gc-sections请在生成所需的输出后将其删除。

您没有询问如何识别未使用的数据,但要做到这一点,请将选项添加-fdata-sections到您的编译中。