首页 > 解决方案 > 如何避免 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,也许他们会在未来的编译器中修复它。这是一个棘手的问题,他们相处得很好

标签: cvisual-c++

解决方案


编译器看不到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;
        }
    }
}

推荐阅读