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

时间:2015-09-04 06:52:15

标签: c gcc

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

int test() {
    return 4;
}

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

如果没有这样的编译器标志,可能会告诉clang静态分析器抱怨它。

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

2 个答案:

答案 0 :(得分:8)

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

  • 使用warn_unused_result属性
  • 定义函数
  • 使用-Wunused-result启用gcc标记。

这将告诉您函数return中的任何未使用的值。

如有任何疑问, SEE IT LIVE SEE IT LIVE AGAIN 感谢M.M评论中的链接功能

或者:

#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;
}

编译(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
$

答案 1 :(得分:1)

某些静态代码分析器(如splint)可以检查这些事情:

$ splint check.c
Splint 3.1.2 --- 03 May 2009

check.c: (in function main)
check.c:6:5: Return value (type int) ignored: test()
  Result returned by function call is not used. If this is intended, can cast
  result to (void) to eliminate message. (Use -retvalint to inhibit warning)

与@ Sourav的回答不同,这不需要在目标函数上使用特定的__attribute__注释,但另一方面可能会发出许多警告。通常可以通过使用注释(如/*@alt void@*/)来抑制特定函数或函数调用的警告。