Поддельное предупреждение «переменная может быть засечена» для собственного синтаксиса исключений Objective C - PullRequest
0 голосов
/ 29 декабря 2010

При компиляции кода 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.)

1 Ответ

0 голосов
/ 29 декабря 2010

В справочнике по gcc: «Обратите внимание, что некоторые флаги предупреждения не подразумеваются -Wall. Некоторые из них предупреждают о конструкциях, которые пользователи обычно не считают сомнительными, но которые иногда вы можете захотеть проверить;в некоторых случаях их необходимо или трудно избежать, и не существует простого способа изменить код для подавления предупреждения. Некоторые из них включены -Wextra, но многие из них должны быть включены по отдельности. "

В основном-Wextra -Werror говорит компилятору: «Пожалуйста, ломайте мою сборку, даже когда я делаю вещи, которые многие не считают сомнительными».Я не понимаю, почему это желательно (хотя я должен отметить, что у меня есть глубокая личная вендетта против -Werror по другим причинам, поэтому я могу быть предвзятым).

В попытке быть более полезным, чем"не делай этого", может быть, не-клоббер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...