不合逻辑的 C6001 警告:在 Visual Studio 中使用 C 中的未初始化内存警告

You*_*f13 4 c malloc free struct

鉴于此代码:

#include <stdlib.h>

typedef struct
{
    int *p;
} MyStruct;

MyStruct Test()
{
    MyStruct ms;
    ms.p = malloc(sizeof(int) * 5);
    if (!ms.p) exit(-1);
    return ms;
}

int main(void)
{
    while (1)
    {
        MyStruct t = Test();
        free(t.p); // C6001: Using uninitialized memory 't.p'.
    }
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 在呼叫线路上显示 C6001 警告free。但是,我发现没有办法在内存 tp 未初始化的情况下实现空闲线。我缺少什么?

在此输入图像描述

pax*_*blo 6

这在很大程度上是误报,即使在 MSVC 2019 中仍然存在。该t.p变量不可能未初始化。

事实上,如果不将free()语句初始化为非NULL值,它就无法到达该语句。但是,即使您考虑到编译器不知道该exit()函数不会返回的可能性,这实际上是无关紧要的,无论它是否返回,该结构仍然会被初始化为某些内容,并且在任何情况下,它都是完全合法的到free(NULL)

删除if .. exit对警告没有影响,所以我怀疑这就是问题所在。更有可能的是,这只是 MSVC 积极报告警告,阻止它打扰您的最佳方法就是忽略它。

我的意思并不是说忽略这个警告(鉴于我的本性,我永远不会这样做),我的意思是告诉 MSVC 闭嘴:

while (1) {
    MyStruct t = Test();

    // MSVC wrongly reports this as using uninitialised variable.
    #pragma warning(push)
    #pragma warning(disable: 6001)
    free(t.p);
    #pragma warning(pop)
}
Run Code Online (Sandbox Code Playgroud)