我有这样的功能:
#include <setjmp.h>
jmp_buf buf;
void func2(int g);
extern int some_global;
void func(int x)
{
if (setjmp(buf))
return;
if (some_global)
x += 5;
func2(x);
}
GCC (gcc (Debian 4.4.5-8) 4.4.5) 给出警告:
test.c:在函数'func'中: test.c:5:警告:参数“x”可能被“longjmp”或“vfork”破坏 [-Wclobbered]
为什么????我的意思是,显然我不在乎是否x
被破坏,因为它不可能在setjmp
返回后使用。考虑setjmp
到它对.
我的主要兴趣是在我继承的代码库中查找错误,因此,“改用这种编码风格”不是我要寻找的建议。然而,这里有许多奇怪的曲折。例如,如果x
是局部变量而不是参数,则 GCC 不会抱怨。此外,GCC 不会在没有if (some_global)
线路的情况下抱怨。好的。有些东西搞砸了 GCC 的流量分析,或者 GCC 可能知道我不知道的事情。
所以,
有没有一种简单的方法来抑制这个函数的这个警告,就像你可以将未使用的参数转换为一样
(void)
?还是我只是在整个项目范围内抑制警告?
还是我错过了什么?
更新:让我与您分享一个稍微不同但不会产生警告的版本:
#include <setjmp.h>
jmp_buf buf;
void func2(int g);
extern int some_global;
void func(int y)
{
int x = y;
if (setjmp(buf))
return;
if (some_global)
x += 5;
func2(x);
}