在阅读大型 C 项目的部分代码时,我发现了一些被标记为未使用但实际上在函数中使用的参数。
我考虑过 grepping 未使用的属性,但是它们太多了,无法手动验证它们是否真的未使用。
我的问题如下:有没有办法询问 gcc(或 clang)是否有任何属性不合理或未应用?基本上,对于那种代码:
int f(int arg __attribute__((unused))) {
return arg + 2;
}
我想要一个警告,告诉我我的论点没有被使用。
在阅读大型 C 项目的部分代码时,我发现了一些被标记为未使用但实际上在函数中使用的参数。
我考虑过 grepping 未使用的属性,但是它们太多了,无法手动验证它们是否真的未使用。
我的问题如下:有没有办法询问 gcc(或 clang)是否有任何属性不合理或未应用?基本上,对于那种代码:
int f(int arg __attribute__((unused))) {
return arg + 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
它不会帮助您找到未使用的变量,但一旦找到,您可以确保它们确实未被使用。
你可以 #define
离开unused
,就像这样
#define unused
空__attribute__
语句将被忽略,编译器将发出有关“未使用参数”的警告,如果使用正确的选项 ( -Wunused-parameter
) 启用警告。
unused
但是,如果在代码中的其他地方使用字符序列,这可能会破坏代码,因为它也会在那里消失。
我不能代表 GCC,但你可以教 Clang 使用-Werror-used-but-marked-unused
旗帜尖叫和喊叫。
您也可以使用-W(error-)unused-parameter
.
因为在 Clang 中有很多有用的警告,我通常只使用-Werror -Weverything
. 选择性地忽略我不感兴趣的警告,并防止使用-Wno-error-...
.
我使用了 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 "((未使用))"
有了这个,我所有的行都包含未使用的属性。但是,如果一行包含两个或更多未使用的属性,我只会得到一次。
我手动检查哪些行不在两个输出上:/。