gpt4 book ai didi

c - 不合逻辑的 C6001 警告 : Using uninitialized memory warning in C with Visual Studio

转载 作者:行者123 更新时间:2023-12-03 23:10:01 30 4
gpt4 key购买 nike

鉴于此代码:

#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'.
}
}

Visual Studio 在 free 上显示 C6001 警告调用线。但是,我看到没有办法在内存 t.p 未初始化的情况下实现空闲线。我错过了什么?

enter image description here

最佳答案

这在很大程度上是一个误报,即使在 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)
}

关于c - 不合逻辑的 C6001 警告 : Using uninitialized memory warning in C with Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59238295/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com