g++ How to get warning on ignoring function return value

前端 未结 5 1091
伪装坚强ぢ
伪装坚强ぢ 2020-11-30 04:52

lint produces some warning like:

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

From the lint manual

相关标签:
5条回答
  • 2020-11-30 05:09

    -Wunused-result should do this for you. This isn't one of the warnings -Wall turns on:

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

    The function has to have the warn_unused_result attribute applied to it (Thanks paxdiablo).

    0 讨论(0)
  • 2020-11-30 05:13

    Since C++17 you can use the [[nodiscard]] attribute.

    Example:

    [[nodiscard]] int bar() {
      return 42;
    }
    
    0 讨论(0)
  • 2020-11-30 05:13

    I solved the problem like this:

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

    then instead of (void)foo() use ignore_result(foo())

    Then the code compiles with -Wall just fine.

    0 讨论(0)
  • 2020-11-30 05:14

    The answers about using __attribute__((warn_unused_result)) are correct. GCC isn't so good at this functionality, though! Be aware: it will not warn for non-POD types. That means, for example, if you return a class with a destructor (or a class with instance variables with destructors) you'll never see a warning about ignoring the result.

    Relevant bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177

    Example where it fails:

    struct Error {
    ~Error();
    };
    
    __attribute__((warn_unused_result)) Error test();
    
    int main()
    {
        test();
        return 0;
    }
    

    So, don't rely on this for return types which aren't pretty simple.

    0 讨论(0)
  • 2020-11-30 05:16

    Thanks to WhirlWind and paxdiablo for the answer and comment. Here is my attempt to put the pieces together into a complete (?) answer.

    -Wunused-result is the relevant gcc option. And it is turned on by default. Quoting from gcc warning options page:

    -Wno-unused-result

    Do not warn if a caller of a function marked with attribute warn_unused_result (see Variable Attributes) does not use its return value. The default is -Wunused-result

    So, the solution is to apply the warn_unused_result attribute on the function.

    Here is a full example. The contents of the file 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;
    }
    

    and corresponding compilation result:

    $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
    

    Note again that it is not necessary to have -Wunused-result since it is default. One may be tempted to explicitly mention it to communicate the intent. Though that is a noble intent, but after analyzing the situation, my choice, however, would be against that. Because, having -Wunused-result in the compile options may generate a false sense of security/satisfaction which is not true unless the all the functions in the code base are qualified with warn_unused_result.

    0 讨论(0)
提交回复
热议问题