c++cgccstatic-analysis

How can I raise a warning if a return value is disregarded?


I'd like to see all the places in my code (C++) which disregard the return value of a function. How can I do it, with GCC or static code analysis tool?

A bad code example:

int f(int z) {
    return z + (z*2) + z/3 + z*z + 23;
}


int main()
{
  int i = 7;
  f(i); ///// <<----- Here I disregard the return value

  return 1;
}

Please note that:


Solution

  • You want GCC's warn_unused_result attribute:

    #define WARN_UNUSED __attribute__((warn_unused_result))
    
    int WARN_UNUSED f(int z) {
        return z + (z*2) + z/3 + z*z + 23;
    }
    
    int main()
    {
      int i = 7;
      f(i); ///// <<----- Here I disregard the return value
      return 1;
    }
    

    Trying to compile this code produces:

    gcc test.c
    

    Output:

    test.c: In function `main':
    test.c:16: warning: ignoring return value of `f', declared with
    attribute warn_unused_result
    

    You can see this in use in the Linux kernel; they have a __must_check macro that does the same thing; it looks like you need GCC 3.4 or greater for this to work. Then you will find that macro used in the kernel header files:

    unsigned long __must_check copy_to_user(void __user *to,
                                            const void *from, unsigned long n);