私はこのような機能を持っています:
#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);
}