Предупреждение MSVC 4611 относительно setjmp со структурой POD

Попытка включить некоторые уровни предупреждений в кодовой базе C, которая также строится как C++. Я даю Visual Studio шанс (по какой-то причине).

Получил предупреждение о взаимодействиях с setjmp, несмотря на отсутствие соответствующих деструкторов. поэтому я сделал тест:

#include <setjmp.h>

struct X { int y; };

int main() {
    struct X x;

    jmp_buf buf;
    if (setjmp(buf) == 0) {
        longjmp(buf, 1);
    } else {
        // whatever.
    }
}

Включение предупреждения в командной строке:

C:\wherever>cl /we4611 test.cpp

test.cpp test.cpp(9): ошибка C4611: взаимодействие между '_setjmp' и уничтожением объекта C++ не переносимо

Это кажется чрезвычайно полезным предупреждением — если оно предупреждало меня о пересечении кода деструктора C++. Но это тип POD. Кода деструктора быть не должно.

Я что-то здесь упустил, или они испортили это предупреждение до такой степени, что оно стало в основном «вы использовали setjmp в программе на C++»?


person HostileFork says dont trust SE    schedule 29.07.2017    source источник
comment
Предупреждение таинственным образом исчезает, если вы включаете оптимизацию? (Эта конкретная диагностика может зависеть от того, обнаружил ли компилятор, что тип является POD, и он может быть не столь осторожен в отношении обнаружения в режиме по умолчанию с минимальным временем компиляции.)   -  person zwol    schedule 29.07.2017
comment
@zwol При полной оптимизации (cl /we4611 /Ox test.cpp) предупреждение все равно выдается. :-(   -  person HostileFork says dont trust SE    schedule 29.07.2017
comment
Тогда, боюсь, у меня закончились идеи. Я согласен с вашей оценкой того, что предупреждение бесполезно, если оно срабатывает на POD.   -  person zwol    schedule 29.07.2017
comment
@zwol Ну, в любом случае спасибо. Я добавил предложение на сайте MS.   -  person HostileFork says dont trust SE    schedule 01.08.2017


Ответы (1)


они испортили это предупреждение до такой степени, что оно превратилось в «вы использовали setjmp в программе на C++»?

Похоже на то.

Я бы, наверное, сам классифицировал это как ошибку. Но было проще сделать предложение по Сайт Майкрософт. Предложения можно проголосовать, там...

person HostileFork says dont trust SE    schedule 29.07.2017