g ++如何在忽略函数返回值时发出警告

Aru*_*run 26 c++ gcc g++ return-value compiler-warnings

lint产生一些警告,如:

foo.c XXX Warning 534: Ignoring return value of function bar()
Run Code Online (Sandbox Code Playgroud)

来自lint 手册

534忽略功能的返回值

'符号'(与位置比较)返回值的函数仅针对副作用调用,例如,在语句本身或逗号运算符的左侧.尝试:(void)function(); 调用函数并忽略其返回值.另请参见§5.5"标志选项"中的fvr,fvo和fdr标志.

我想在编译期间得到这个警告,如果有的话.gcc/g ++中有没有选项来实现这个目的?我打开了,-Wall但显然没有发现这一点.

Aru*_*run 27

感谢WhirlWindpaxdiablo的回答和评论.这是我尝试将各个部分组合成一个完整的(?)答案.

-Wunused-result 相关的gcc选项.并且它在默认情况下开启.从gcc警告选项页面引用:

-Wno-unused-result

如果标记有属性的函数的调用者warn_unused_result(请参阅变量属性)不使用其返回值,请 不要发出警告.默认是-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;
}
Run Code Online (Sandbox Code Playgroud)

和相应的编译结果:

$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
Run Code Online (Sandbox Code Playgroud)

请再次注意,没有必要使用-Wunused-result,因为它是默认值.人们可能会试图明确地提及它以传达意图.虽然这是一个崇高的意图,但在分析了这种情况之后,我的选择却是反对的.因为,-Wunused-result在编译选项中有可能会产生错误的安全感/满意感,除非代码库中的所有函数都符合条件,否则这种感觉是不正确的warn_unused_result.


Jya*_*aif 18

从C++ 17开始,您可以使用该[[nodiscard]]属性.

例:

[[nodiscard]] int bar() {
  return 42;
}
Run Code Online (Sandbox Code Playgroud)

  • 在 C++20 中,您可以添加消息字符串:https://en.cppreference.com/w/cpp/language/attributes/nodiscard (2认同)

小智 7

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

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

失败的例子:

struct Error {
~Error();
};

__attribute__((warn_unused_result)) Error test();

int main()
{
    test();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,对于不是很简单的返回类型,不要依赖它。


Whi*_*ind 6

-Wunused-result应该为你做这件事.这不是警告之一 - 墙打开:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

该函数必须应用warn_unused_result属性(感谢paxdiablo).