При компиляции кода Objective-C с блоками @try
с использованием флага предупреждения -Wextra
я иногда получаю предупреждения в виде « переменная 'foo' может быть перекрыта" longjmp "или" vfork "». (Несмотря на специфический характер текста, это относится ко всем функциям, которые имеют атрибут returns_twice
, включая функции времени выполнения обработки исключений.) Предупреждение относится к этому тексту в спецификации C:
Все доступные объекты имеют значения, а все остальные компоненты абстрактной машины имеют состояние на момент вызова функции longjmp, за исключением того, что значения объектов автоматического хранения, локальные для функции, содержащей вызов соответствующий макрос setjmp, который не имеет volatile-квалифицированного типа и был изменен между вызовом setjmp и вызовом longjmp, является неопределенным.
Как правило, я могу обойти это, помечая уязвимые переменные как volatile или помещая код в функцию вне строки. Тем не менее, сейчас я вижу это для встроенных функций в библиотеке. Вот сжатый тестовый пример:
static inline uint64_t Foo(void)
{
union
{
int32_t a;
uint64_t b;
} l;
l.a = 1; // warning: variable 'l' might be clobbered by 'longjmp' or 'vfork'
return l.b;
}
void Test(uint64_t *value)
{
@try
{
*value = Foo();
}
@catch (...) {}
}
Предупреждение появляется при сборке для i386 с использованием apple-gcc 4.0 или 4.2 (не llvm-gcc) с -Wextra
и включенной оптимизацией. Обратите внимание, что это не является реальной проблемой, так как значение не будет использоваться, если будет обнаружено исключение.
Страница руководства предполагает, что это предупреждение контролируется -Wuninitialized
, но это не так. Использование -Wuninitialized
не вызывает его, но использование -Wextra -Wno-uninitialized
делает.
Итак, вопрос в том, есть ли способ подавления этого предупреждения, кроме отключения -Wextra
или переключения компилятора? (В качестве мазохиста я, конечно, использую -Werror
.)