非零退出编译器提示

Jac*_*aib 5 c c++ compiler-warnings

长话短说:我想要

int some_opaque_error_handler() __attribute__((returns_nonzero));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ equivalent of this
Run Code Online (Sandbox Code Playgroud)

我使用的基于 AC/C++ 的库使用返回码来指示错误,这会导致编译器抱怨使用“统一”值。例如

int some_opaque_error_handler() __attribute__((returns_nonzero));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ equivalent of this
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果返回错误,则*p永远不会访问它,但由于错误处理程序是不透明的,编译器无法知道这一点。bar()foo()

无论如何,是否有办法让编译器知道通过错误处理程序返回的结果几乎总是[1] 非零(因此任何后续访问都不会发生?)[2]。我在运行静态分析器时遇到类似的问题,因为它们也假设执行可能会继续经过这些点。


[1]用户可以将错误处理程序的行为更改为(尽管不太可能)返回,0因此任何解决方案/编译器提示都必须是非绑定的。

[2]是的,我知道我可以简单地初始化变量(这就是我目前所做的),但是:

  1. 此类案例有大量的公制数量
  2. 这些警告似乎严重依赖于编译器、编译器版本、优化级别以及土星环相对于银河平面的方向

所以这感觉就像是一场赢不了的打地鼠游戏

Kam*_*Cuk 0

将函数标记为可写访问。

__attribute__((__access__(__write_only__, 1)))
int foo(int **ptr) {
Run Code Online (Sandbox Code Playgroud)

我想int some_opaque_error_handler() __attribute__((returns_nonzero));

你会这样做:

#define some_opaque_error_handler()  \
   __extension__({ \
     int _x = some_opaque_error_handler(); \
     if (_x == 0) __builtin_unreachable(); \
     _x; \
  })
Run Code Online (Sandbox Code Playgroud)

或调用网站上的相同内容。