2010-05-20 89 views
21

棉绒产生一定的警示作用,如:克++如何获得忽略函数的返回值警告

foo.c XXX Warning 534: Ignoring return value of function bar() 

从皮棉manual

534忽略的功能

“符号”返回值(与位置相比较)A 返回值的函数是 仅针对副作用调用,因为对于 示例,在st中本身或 运算符的逗号左侧。尝试:(void)function();以 调用函数并忽略其返回值 的值。请参阅第5.5节“标志选项”中的fvr,fvo和fdr 标志。

我想在编译期间得到这个警告,如果存在的话。 gcc/g ++中有没有选项可以实现这个功能?我打开了-Wall,但显然没有检测到这一点。

回答

22

感谢WhirlWindpaxdiablo的回答和评论。这是我试图把这些部分放在一个完整的(?)答案中。

-Wunused-result相关的gcc选项。并且它默认打开。从gcc warning options page报价:

-Wno-unused-result

如果标记属性warn_unused_result(见 Variable Attributes)函数的调用者不使用其返回值时不发出警告。缺省值为-Wunused-result

因此,解决方案是在该函数上应用warn_unused_result属性。

下面是一个完整的例子。该文件的unused_result.c

int foo() { return 3; } 

int bar() __attribute__((warn_unused_result)); 
int bar() { return 5; } 

int main() 
{ 
    foo(); 
    bar(); /* line 9 */ 
    return 0; 
} 

和相应的编译的结果内容:再次

$gcc unused_result.c 
unused_result.c: In function ‘main’: 
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result 

注意没有必要已经-Wunused-结果,因为它是默认的。有人可能会试图明确提及它来传达意图。虽然这是一个高尚的意图,但在分析了这种情况之后,我的选择将会与此相反。因为在编译选项中有-Wunused-result可能会产生错误的安全/满意感,这是不正确的,除非代码库中的功能都使用warn_unused_result限定。

4

关于使用__attribute__((warn_unused_result))的答案是正确的。不过,GCC并不擅长这个功能。请注意:它不会警告非POD类型。这意味着,例如,如果您使用析构函数(或具有带析构函数的实例变量的类)返回类,则永远不会看到有关忽略结果的警告。

相关的bug:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177

例子失败:

struct Error { 
~Error(); 
}; 

__attribute__((warn_unused_result)) Error test(); 

int main() 
{ 
    test(); 
    return 0; 
} 

所以,不要依赖此为返回类型不属于非常简单。

+0

一些额外的相关bugz​​illas:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 38172和https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 46643 – pestophagous 2017-07-19 20:58:31

0

我解决了这样的问题:

#define ignore_result(x) if (x) {} 

然后代替(void)foo()使用ignore_result(foo())

然后代码和-Wall就好了编译。