У меня есть кроссплатформенный код, который я сократил до следующего:
int bar(char **p) {
*p = "hello";
return 1;
}
void foo(int n) {
int x = 0;
char *p;
if (n) x = bar(&p);
if (x) if (p) return;
}
Компиляция этого с GCC 7 не дает предупреждений.Компиляция этого с MSVC дает два предупреждения:
$ gcc -Wall -Wextra -c foo.c
$ cl /Wall /c foo.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo.c
c:\cygwin64\home\kyz\foo.c(9) : warning C4701: potentially uninitialized local variable 'p' used
c:\cygwin64\home\kyz\foo.c(9) : warning C4703: potentially uninitialized local pointer variable 'p' used
Если n
не ноль, p инициализируется.Если n
равно нулю, p
не инициализируется, но if (x)
и нулевое значение по умолчанию x
гарантирует, что if (p)
никогда не будет достигнуто.
Как я могу сказать MSVC подавлять это безизменить уровни предупреждений компилятора или инициализировать p
фиктивным значением?
FWIW, я сообщил об этом в Microsoft , возможно, они исправят это в будущем компиляторе.Это сложная проблема, и они в хорошей компании