如何找到不相关的未使用属性?

时间:2013-12-05 11:01:56

标签: c gcc clang unused-variables

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

我考虑过对未使用的属性进行grepping,但是有太多的属性需要手动验证它们是否真的未使用过。

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

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

我想告诉我,我的论点没有被使用。

4 个答案:

答案 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))”

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

最后一部分:

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