У меня есть такая функция:
#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 знает что-то, чего я не знаю.
So,
Есть ли простой способ подавить это предупреждение для этой функции, точно так же, как вы можете преобразовать неиспользуемые параметры в
(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);
}
-Wextra
(ввод-Wclobbered
). вы используете любой флаг? - person Hasturkun   schedule 11.10.2011-Wuninitialized
задокументирован как генерирующий подобное предупреждение, хотя в противном случае я не могу заставить gcc сгенерировать это сообщение - person Hasturkun   schedule 12.10.2011x
помещается в регистр, а не в стек, тоx
может быть заблокирован, если выполняется переход. - person jww   schedule 06.06.2016x
никогда не используется, если совершается прыжок, поэтому не имеет значения, заторможен ли он (так что предупреждение является ненужным и нежелательным). - person Dietrich Epp   schedule 06.06.2016