GCC -Wunused-function无法正常工作(但其他警告正在运行)

sol*_*les 5 c c++ gcc compiler-warnings

我试图通过使用GCC的-Wunused-function标志在我的代码库中找到未使用的函数.

正如我所料,编译下面的代码会gcc -Wall -Wunused-function main.cpp打印一个unused variable警告:

warning: unused variable ‘x’ [-Wunused-variable]
Run Code Online (Sandbox Code Playgroud)

但是,编译器不会发出unused-function警告. 我需要做些什么才能使GCC注意到未使用的功能foo()

// main.cpp

void foo(){ } //should (but doesn't) trigger 'unused function' warning

int main (int argc, char **argv){
    int x; //correctly triggers 'unused variable' warning
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请记住,我确实想要未使用的功能警告.这不是 "我怎么摆脱警告"的问题.

hob*_*bbs 13

非静态函数永远不会被视为"未使用",因为它的符号被导出并可供其他编译单元使用,这是gcc无法检测到的.-Wunused-functions仅记录以警告已声明但未调用的静态函数.


Ani*_*nge 5

来自 gcc 文档:

-Wunused-function:每当声明了静态函数但未定义或未使用非内联静态函数时发出警告。此警告由 -Wall 启用。

如您所见,您已经定义并声明了一个非静态函数。此外,您的函数没有被内联(为此您需要使用-O3优化)。

到目前为止,我不确定您要求的内容是否存在于 gcc 中。:-) 但它是开源的……也许你可以实现它?

  • 这个不对。没有给出警告的原因是因为该函数具有外部链接,而不是内部链接(“静态”)。引用文本的意思是:永远不会警告具有外部链接的函数;对于静态函数,如果它根本没有定义,或者它既未使用又未声明为“内联”,您将收到警告。如果您将该函数声明为 `static void foo() {}`,您应该会收到警告。 (2认同)

Joh*_*ade 5

您可以使用链接器优化查找未使用的非静态函数。

我用编译了你的main.cpp

gcc -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--print-gc-sections main.cpp
Run Code Online (Sandbox Code Playgroud)

和输出

/usr/bin/ld: Removing unused section '.text._Z3foov' in file '/tmp/cc9IJvbH.o'
Run Code Online (Sandbox Code Playgroud)

显示foo()未使用,链接器可以将其删除。