如何在C中强制使用返回值 [英] How to enforce the usage of return values in C

查看:127
本文介绍了如何在C中强制使用返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在搜索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静态分析器对此进行抱怨.

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

解决方案

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

  • 使用warn_unused_result属性定义功能
  • 使用gcc启用-Wunused-result标志.

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


如果有任何疑问,请 立即观看 感谢 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;
}

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

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.

解决方案

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

  • defining the function with warn_unused_result attribute
  • enabling -Wunused-result flag with gcc.

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
$

这篇关于如何在C中强制使用返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆