c - 如何避免 MSVC 警告 C4701:可能未初始化的局部变量
问题描述
我有一些跨平台代码,我将其精简为:
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
为虚拟值的情况下告诉 MSVC 抑制这种情况?
FWIW,我将此报告给 Microsoft,也许他们会在未来的编译器中修复它。这是一个棘手的问题,他们相处得很好
解决方案
编译器看不到if (x)
不能输入,除非if (n)
输入,在这种情况下p
是通过函数调用分配的。
大多数编译器不会执行那么深入的分析(静态分析器的用途),因此它会看到一个可能的代码路径,p
无需初始化即可读取。
也许处理这个问题的最好方法是将其范围限制在p
使用它的地方:
void foo(int n) {
int x = 0;
if (n) {
char *p;
x = bar(&p);
if (x && p) {
return;
}
}
}
推荐阅读
- ios - 是否可以让我的班级遵守这个似乎需要结构的协议?
- angular - 为什么 rxjs debounceTime 不适用于使用“of”运算符创建的可观察对象?
- r - 将因子变量添加到个人及其伴侣的重复测量中
- php - 将我的 .php 输出发送到 curl 命令,该命令使用机器人在电报上向我发送消息
- matlab - 将带有子图的图形保存为 PDF
- javascript - 如何使用 webpack 4 模板化 javascript 文件中的变量
- laravel - Laravel 多选数组验证总是报错
- java - 我怎样才能从这个位置实现最终目标?代码抛出越界异常
- javascript - Grunt:将文件名插入文件
- powershell - 如何从自动化字符串中删除空格以导出到 SQLPlus SELECT 命令 LockedOut.sql 文件