2

在阅读大型 C 项目的部分代码时,我发现了一些被标记为未使用但实际上在函数中使用的参数。

我考虑过 grepping 未使用的属性,但是它们太多了,无法手动验证它们是否真的未使用。

我的问题如下:有没有办法询问 gcc(或 clang)是否有任何属性不合理或未应用?基本上,对于那种代码:

int f(int arg __attribute__((unused))) {
    return arg + 2;
}

我想要一个警告,告诉我我的论点没有被使用。

4

4 回答 4

2

我真的不能为此感到自豪,因为我在http: //sourcefrog.n ​​et/weblog/software/languages/C/unused.html 偶然发现了它。当您尝试使用它们时,它会导致 UNUSED 变量给出编译器错误。

#ifdef UNUSED 
    // Do notthing if UNUSED is defined
#elif defined(__GNUC__) 
// Using the gcc compiler - do the magic!
#define UNUSED(x) UNUSED_ ## x __attribute__((unused)) 
#elif defined(__LCLINT__) 
#define UNUSED(x) /*@unused@*/ x 
#else 
// unknown compiler - just remove the macro
#define UNUSED(x) x 
#endif

它不会帮助您找到未使用的变量,但一旦找到,您可以确保它们确实未被使用。

于 2013-12-08T16:31:05.027 回答
2

你可以 #define离开unused,就像这样

#define unused

__attribute__语句将被忽略,编译器将发出有关“未使用参数”的警告,如果使用正确的选项 ( -Wunused-parameter) 启用警告。

unused但是,如果在代码中的其他地方使用字符序列,这可能会破坏代码,因为它也会在那里消失。

于 2013-12-05T11:36:16.400 回答
2

我不能代表 GCC,但你可以教 Clang 使用-Werror-used-but-marked-unused旗帜尖叫和喊叫。
您也可以使用-W(error-)unused-parameter.

因为在 Clang 中有很多有用的警告,我通常只使用-Werror -Weverything. 选择性地忽略我感兴趣的警告,并防止使用-Wno-error-....

于 2014-01-16T11:03:27.777 回答
0

我使用了 alk 答案,但我为那些面临同样问题的人提供了更多详细信息。

第一部分:

alk 建议定义一个名为unused. 由于它是一个包含多个构建单元和 Makefile 的大型项目,我决定使用 gcc 定义宏:

gcc -Dunused= ...

然后,我清理了项目并重建:

make clean && make

由于代码中名为 used_something 的变量,这变得非常糟糕。所以我不得不重命名这些变量才能继续。

由于我使用了该-Wall选项,因此我现在收到很多警告,看起来都像:

char/serial.c: In function ‘serial_write’:
char/serial.c:151:69: warning: unused parameter ‘odf’ [-Wunused-parameter]
 static size_t serial_write(tty_struct_t *tty, open_file_descriptor* odf __attribute__((unused)), const unsigned char* buf, size_t count)
                                                                 ^

所以我重新运行:

使干净 && 使 > 出 2>&1

现在,我 grep 结果:

grep Wunused-参数输出

我收到所有带有文件名和行号的警告。

第二部分:

由于我使用git,我可以直接这样做:

git grep -n "((未使用))"

有了这个,我所有的行都包含未使用的属性。但是,如果一行包含两个或更多未使用的属性,我只会得到一次。

最后部分:

我手动检查哪些行不在两个输出上:/。

于 2013-12-05T16:33:04.617 回答