我正在从事一个加密项目,并遇到了以下错误时,试图编译程序。
主要cpp(520):错误C4703:使用了可能未初始化的局部指针变量"pNamesPtr"
==========构建版本:0成功,1失败,0最新,0跳过========
DLLNAMES[i].UsedAlready = 0;
}
*dwOutSize = (DWORD)pNamesPtr - (DWORD)pBuffer;//*<----is line 520 of error
*dwImportsSize = *dwOutSize - *dwIATSize;
return pBuffer;
}
#pragma pack(1)
typedef struct
有人能帮我解决这个错误吗?你需要更多的代码来得到一个好的答案吗?
4条答案
按热度按时间b1uwtaje1#
这个警告并不总是一个bug,有时候它只是优化的结果。因为它在你的代码中,你不知道这是什么,它实际上可能是一个bug。
例如,如果我写:
如果您正在进行优化,那么您可能知道当
this_and_that
的值为真时,whatever
的值始终为真,因此如果调用printf
,则i
已经保证被初始化,但编译器通常无法计算出this_and_that
和whatever
之间的关系,这就是为什么你会得到这个警告。2一个可能的快速解决方法是在你声明变量的地方将它初始化为一个默认值。3在我看来,节省初始化是一个不好的做法,也是很多bug的来源。fzsnzjdm2#
意思是
pNamesPtr
时没有初始化它,所以它以一个无效值开始;以及检查从声明到使用点的所有代码路径。它们都为变量赋值了合理的东西吗?如果没有,就修改它们。
如果是这样,并且您确信您正确地分配了它,那么您是否可以简化代码,以便编译器可以明显地看到它是正确的?
如果所有的方法都失败了,你可以通过初始化
nullptr
或者其他的默认值来让编译器安静下来,但是只有在你确信你的代码是正确的时候才这么做--编译器通常很擅长发现这样的错误。yhived7q3#
这个错误意味着编译器不知道所使用的变量是否有赋值。例如:
如果
someFunction()
更改了someBool
的值,那么您可能最终会使用i
参数调用printf
,而i
没有任何赋值。如果您确定代码正确,则可以在Visual Studio中消除该错误,方法是在cpp文件行的顶部放置:
或者,您可以通过转到
Properties
/C/C++
/General
/SDL checks
并将其设置为No (/sdl-)
来禁用对整个项目的检查。或者,如果你不关心性能,你可以在
pNamesPtr
定义的地方给它赋值。wgeznvg74#
将以下代码放入代码中: