У меня есть такая функция:
#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: In function ‘func’: test.c:5: warning: argument ‘x’ might be clobbered by ‘longjmp’ or ‘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);
}