【发布时间】:2011-12-05 00:44:23
【问题描述】:
我有这样的功能:
#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 不会抱怨。此外,如果没有if (some_global) 行,GCC 也不会抱怨。好的。有什么东西打乱了 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);
}
【问题讨论】:
-
我认为编译器不够聪明。在启用所有警告并将其视为错误的编译时,我不得不使用 MSVC++ 解决一些类似的问题。编译器有时可以说些什么是件好事,因为它可以为其他比我们知识渊博和幸运的人节省一些时间。
-
我的 gcc (4.5.2) 只有在使用
-Wextra时才会抱怨(引入-Wclobbered)。你在使用任何一个标志吗? -
@Hasturkun:看来你自己已经回答了你的问题。
-
我没有收到 gcc 4.6.1 的警告。可能是特定于版本的问题。
-
@DietrichEpp:我问是因为
-Wuninitialized被记录为生成类似的警告,尽管我无法让 gcc 生成该消息