【问题标题】:Make warn_unused_result applied to all function with GCC使用 GCC 将 warn_unused_result 应用于所有函数
【发布时间】:2012-11-11 18:55:20
【问题描述】:

是否可以告诉 GCC 对所有函数使用 warn_unused_result 标志,即使没有相应的属性?因为如果我忘记检查返回值,我也会忘记添加 GCC 特定属性。

我发现其他一些编译器也可以做到这一点。

【问题讨论】:

  • 通过查看文档我会说答案是否定的。
  • 替代方案:您可以通过夹板运行程序,测试忽略的返回值:splint.org
  • 哪些编译器支持它?

标签: c gcc compiler-construction compiler-warnings


【解决方案1】:

不,您只能告诉 gcc 使用 -Wno-unused-result 忽略所有 warn_unused_result 标志,但相应的 -Wunused-result 仅设置默认值(仅在标志上发出警告)。使用-Wall -Wextra -pedantic 编译应该会触发警告,如果它可以被激活但它没有,所以它不能。

除此之外,我想知道您为什么要这样做,忽略函数的结果并不少见,并且所有库都可能产生大量警告。

【讨论】:

  • 我们正在编写自己的库,我们希望尽可能多地排除错误。几天前我注意到我们的一位程序员没有检查 fread 的结果。确实,这种情况很少见,但如果它是由于嵌入式机器上的资源不足而发生的,我们的 lib 必须处理它而不会导致主应用程序崩溃。因此,我们希望尽可能多地进行检查。
  • @PoltoS:如果您使用的是 C++,则可能有一种包装返回类型的方法,但这或多或少会像 warn_unused_result 那样工作。
  • 我们正在使用 C... 奇怪的是 GCC 没有提供这样的标志。是否可以稍微破解一下以“虚拟”为每个函数添加这样的标志?
  • @PoltoS:好吧,如果你想进入 gcc 的源代码,当然,一切皆有可能。但除此之外,我没有看到任何选项。
  • 我遇到了同样的问题,偶然发现了这个帖子。只是关于“所有库都可能产生大量警告”这一事实的注释:是的,但可以关闭来自包含库的警告(使用 -isystem),因此仅对他/她正在开发的代码发出警告。 .. 这个选项不在 gcc 中,这有点糟糕...
【解决方案2】:

虽然 GCC 似乎不可能,但您可以运行静态分析器(如 Coverity 和 lint)来捕获这些。

【讨论】:

  • 近 5 年后的好答案;) 隐蔽性是一种 SAAS。我无法将公司的代码上传到某些第三方服务器。此外,第三方服务器对我的环境和系统包含文件一无所知。到目前为止,我还没有找到不会抱怨平台特定类型的好的静态分析器。
  • 我不确定 Coverity 是否仅是 SaaS 产品。我的雇主使用掩护,我相信没有代码离开组织的服务器。 community.synopsys.com/s/question/0D53400003RpaYWCAZ/…
【解决方案3】:

elfs-clang-plugins 中有一个 clang 插件(由我自己编写,开源),可以提供帮助。

虽然不适用于 GCC,但它仍然很有用,例如如果你可以将它添加到你的 CI 把关过程中(如果你有的话)或者只是偶尔手动运行一次。

warn_unused_result 插件将对缺少 warn_unused_result 属性的函数发出警告。插件仅考虑在当前编译单元中声明或定义的函数,因此外部库不会添加噪音。 p>

插件接受一个可选参数 --static-only ,这会导致它只对静态函数发出警告(因为更改外部 API 的工作量太大)。

例子:

int foo(void);

编译器输出:

/tmp/test.c:1:5: warning: missing attribute warn_unused_result
int foo(void);

【讨论】:

  • @Machta - 应该,但你应该试试。
【解决方案4】:

当使用 objc 时,你可以像这样抑制 warn_unused_result 警告,

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-result"
    [YPKWhatsNewContainerViewModel checkWhatsNew]; // return value should be ignored
#pragma clang diagnostic pop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多