在阅读大型C项目代码的一部分时,我发现一些标记为未使用的参数但实际上已在函数中使用。
我考虑过对未使用的属性进行grepping,但是有太多的属性需要手动验证它们是否真的未使用过。
我的问题如下:如果有任何属性不合理或未应用,有没有办法要求gcc(或clang)?基本上,对于那种代码:
int f(int arg __attribute__((unused))) {
return arg + 2;
}
我想告诉我,我的论点没有被使用。
答案 0 :(得分:2)
你可以#define
离开unused
,就像这样
#define unused
忽略空__attribute__
语句,如果使用正确的选项-Wunused-parameter
运行警告,编译器将发出关于“ unused参数的警告。
但是,如果在代码中的其他位置使用字符序列unused
,这可能会破坏代码,因为它也会在那里消失。
答案 1 :(得分:2)
我无法真正对此表示赞赏,因为我在http://sourcefrog.net/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
它不会帮助您找到未使用的变量,但一旦找到,您就可以确保它们确实未被使用。
答案 2 :(得分:2)
我不能代表海湾合作委员会发言,但你可以使用-Werror-used-but-marked-unused
标志教Clang尖叫和喊叫。
您也可以使用-W(error-)unused-parameter
覆盖相反的情况。
因为Clang中有很多有用的警告,我通常只使用-Werror -Weverything
,但是 - 有选择地忽略我不感兴趣的那些警告,并阻止例如使用-Wno-error-...
实现/调用已弃用的函数/方法以提升为错误。
答案 3 :(得分:0)
我使用了alk回答,但是我为那些面临同样问题的人提供了更多细节。
alk建议定义一个名为unused
的宏。由于它是一个包含多个构建单元和Makefile的大型项目,因此我决定使用gcc定义宏:
gcc -Dunused= ...
然后,我清理了项目并重建了:
make clean && make
由于代码中名为unused_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)
^
所以我很反感:
make clean&&制作> out 2>& 1
现在,我发现结果:
grep Wunused-parameter out
我收到了包含文件名和行号的所有警告。
由于我使用git,我可以直接执行:
git grep -n“((unused))”
有了这个,我的所有行都包含未使用的属性。但是,如果一行包含两个或更多未使用的属性,我只会获得一次。
我手动检查两个输出上没有哪些行:/。