Предупреждение C4701 иногда подавляется при компиляции с параметром /RTC1.

Этот фрагмент кода (обратите внимание на закомментированную строку):

#include <malloc.h>

#pragma warning(error: 4701)

int main(){
    char buffer[1024];
    //buffer[0] = 0;

    void *p;
    int size = 1;
    if (size < 2)
        p = malloc(size);
    free(p); // C4701
    return 0;
}

Выдает следующее предупреждение (как и ожидалось):

f:\d\warning.cpp(13) : error C4701: potentially uninitialized local variable 'p' used

Однако когда я раскомментирую назначение в main(), предупреждение больше не выдается. Я компилирую с параметром командной строки /RTC1, чтобы включить проверки ошибок во время выполнения :

cl.exe /RTC1 warning.cpp

Я пробовал последние 64-битные версии компиляторов из Visual C++ 2013 и 2015. Оба ведут себя одинаково.

Вопрос: это ошибка компилятора или этому есть объяснение? В документации Microsoft упоминается, что /RTC1 может выдавать ошибку времени выполнения в местах, где указан C4701, но ничего не говорится об подавлении предупреждения.

РЕДАКТИРОВАТЬ: Загадочная часть заключается в том, что предупреждение исчезает только тогда, когда buffer[0] = 0; отсутствует в комментарии.


person Georgy Pashkov    schedule 13.02.2016    source источник
comment
Попробуйте добавить параметр компилятора /W4 . /W1 используется по умолчанию, и вам может понадобиться, чтобы он был выше. И/или попробуйте /Wall . Источник: msdn.microsoft.com/en-us/library/thxezb7y.aspx< /а>   -  person Richard Critten    schedule 13.02.2016
comment
Я думаю, что это должно вызвать предупреждение в обоих случаях. В противном случае происходит что-то неладное. Я не думаю, что эта линия решит проблему существования и даже не уменьшит ее вероятность.   -  person Humam Helfawi    schedule 13.02.2016
comment
Нет воспроизведения в VS 2010. Я получаю сообщение об ошибке 4701 независимо от того, компилирую ли я с переключателем /RTC1.   -  person Cody Gray    schedule 13.02.2016
comment
Используйте connect.microsoft.com, чтобы сообщить о подобных проблемах, мы не можем исправить это здесь. Я бы случайно предположил, что они скажут вам, что p на самом деле инициализируется, когда вы используете /RTC1, так что это ожидаемо. Это достаточно точно, обязательно упомяните, что это не то поведение, которое вы предпочитаете.   -  person Hans Passant    schedule 13.02.2016
comment
Возможно я неправильно сформулировал: предупреждение подавляется только при раскомментировании закомментированного присваивания в сочетании с /RTC1. Проблема в том, что это задание никак не связано с p!   -  person Georgy Pashkov    schedule 13.02.2016
comment
Ричард Криттен, оператор #pragma warning(error: 4701) имеет приоритет над параметром /W для указанного предупреждения.   -  person Georgy Pashkov    schedule 13.02.2016


Ответы (1)


Есть много ситуаций, когда что-то неоптимально, возможно, с ошибками или даже не определено, когда компилятору очень трудно это обнаружить. Таким образом, вы не должны полагаться на предупреждения (и/или ошибки времени выполнения, вызванные инструментами компилятора), чтобы получить полную правду.

Знайте, что компилятор может предупредить, когда вы делаете что-то глупое. Он также может генерировать код, который взрывается во время выполнения, когда вы делаете что-то глупое. Просто никогда не полагайтесь на это. Он не может обнаружить все, и вы должны сами знать правила.

person Jesper Juhl    schedule 16.03.2016
comment
Не могу не согласиться с вашим комментарием. Но вот проблема: предупреждение подавляется в отладочных сборках, которые используют разработчики, и всплывает в релизных сборках, которые создает сервер сборки. - person Georgy Pashkov; 26.03.2016
comment
@Georgy Pashkov Это не неожиданно. Довольно часто оптимизации выявляют новые предупреждения/проблемы, которые не отображаются в неоптимизированных сборках. - person Jesper Juhl; 26.03.2016