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]是的,我知道我可以简单地初始化变量(这就是我目前所做的),但是:
所以这感觉就像是一场赢不了的打地鼠游戏
将函数标记为可写访问。
__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)
或调用网站上的相同内容。