Какой смысл в этих предупреждениях о затертых переменных?

У меня есть такая функция:

#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);
}
17
задан Marc Mutz - mmutz 15 August 2012 в 17:13
поделиться