Этот фрагмент кода (обратите внимание на закомментированную строку):
#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;
отсутствует в комментарии.
/RTC1
. - person Cody Gray   schedule 13.02.2016p
на самом деле инициализируется, когда вы используете /RTC1, так что это ожидаемо. Это достаточно точно, обязательно упомяните, что это не то поведение, которое вы предпочитаете. - person Hans Passant   schedule 13.02.2016p
! - person Georgy Pashkov   schedule 13.02.2016#pragma warning(error: 4701)
имеет приоритет над параметром /W для указанного предупреждения. - person Georgy Pashkov   schedule 13.02.2016