cgcc

How to enforce the usage of return values in C


I'm searching for a compiler flag for gcc and if possible for clang and the Microsoft compilers as well, that triggers a warning (error with -Werror) if a non-void function is called without using the return value like this:

int test() {
    return 4;
}

int main(void) {
    test(); //should trigger a warning
    int number = test(); //shouldn't trigger the warning
    return 0;
}

If there is no such compiler flag, maybe some way to tell the clang static analyzer to complain about it.

EDIT: To clarify my original question: I actually meant using the return value, not only assigning it.


Solution

  • I never used it myself (do you really need it?), you can try

    This will tell you about any unused value from the function return.


    In case, any doubts, SEE IT LIVE or SEE IT LIVE AGAIN Thanks to M.M for the link in the comment

    Or:

    #include <stdio.h>
    
    extern int func1(void) __attribute__((warn_unused_result));
    extern int func2(void);
    
    int main(void)
    {
        func1();
        int rc1 = func1();
        int rc2 = func1();
        func2();
        printf("%d\n", rc1);
        return 0;
    }
    

    Compilation (GCC 5.1.0 on Mac OS X 10.10.5):

    $ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c warn.c
    warn.c: In function ‘main’:
    warn.c:10:9: error: unused variable ‘rc2’ [-Werror=unused-variable]
         int rc2 = func1();
             ^
    warn.c:8:5: error: ignoring return value of ‘func1’, declared with attribute warn_unused_result [-Werror=unused-result]
         func1();
         ^
    cc1: all warnings being treated as errors
    $