如何在C中强制使用返回值

FSM*_*axB 2 c gcc

我正在为gcc搜索编译器标志,如果可能的话,还要为clang和Microsoft编译器搜索,-Werror如果在不使用返回值的情况下调用非void函数,则触发警告(错误):

int test() {
    return 4;
}

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

如果没有这样的编译器标志,也许某种方式告诉clang静态分析器抱怨它.

编辑:澄清我原来的问题:我实际上是指使用返回值,而不仅仅是分配它.

Sou*_*osh 9

我自己从未使用它(真的需要吗?),你可以试试

  • warn_unused_result属性定义函数
  • 启用-Wunused-result标志gcc.

这将告诉您函数返回中的任何未使用的值.


万一,有任何疑问,SEE IT LIVESEE IT LIVE AGAIN 感谢MM对评论中的链接

要么:

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译(Mac OS X 10.10.5上的GCC 5.1.0):

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

  • 如果他将结果分配给变量但不使用变量,则会发出警告.当他没有将结果分配给变量时,他想要一个警告. (3认同)
  • @Andreas:是什么让你这么想的? (2认同)
  • @Barmar:你确定吗?我认为,'变量集但未使用'警告是独立的. (2认同)