【发布时间】:2018-10-22 17:59:43
【问题描述】:
我有一些跨平台代码,我已将其精简为:
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,我 reported this to Microsoft,也许他们会在未来的编译器中修复它。这是一个棘手的问题,they're in good company
【问题讨论】:
-
也许这不是你的真实代码,但我建议
if (x && p) return;而不是if (x) if (p) return;。 -
我知道这是一个简化的例子,但我不明白为什么
NULL是一个“虚拟值”。我想说,这个警告也不是没有道理的。从现在起 6 个月后,有人,甚至可能是您自己,以一种破坏您真正功能的方式更改bar。 -
例子是从this缩减的。我希望可证明的 use-before-initialisation 编译失败,但我不希望“潜在地”use-before-initialisation 误报。初始化
p将抑制所有使用前初始化分析。
标签: c visual-c++