如果我尝试在以下代码中使用函数geti(),则会收到此警告。
Warning C6385 Reading invalid data from 'snapPts': the readable size is '((geti()+1))*sizeof(DPoint3d)' bytes, but '48' bytes may be read.
但如果我使用像
这样的整数int i
直接然后我无法收到警告。我无法理解那里发生的情况,我用Google搜索了很多但找不到解决方案。我是c ++的新手,请原谅我的拼写错误,请帮助我理解这一点。
注意:我正在使用“Microsoft Mixed(C ++ / CLR)推荐规则”构建代码。
我正在使用以下代码
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <corecrt_wstring.h>
int geti() {
return 2;
}
struct DPoint3d
{
//! x coordinate
double x;
//! y coordinate
double y;
//! z coordinate
double z;
};
int main(array<System::String ^> ^args)
{
int i = 2;
if (i > 1) {
DPoint3d* snapPts = (DPoint3d *)_alloca((geti() + 1) * sizeof(DPoint3d));
DPoint3d* snapPts2 = new DPoint3d();
*snapPts2 = snapPts[1];
}
return 0;
}
非常感谢一个很好的答案。
由于
答案 0 :(得分:1)
消息来自Visual Studio的静态代码分析器,而不是编译器。分析仪是相对较新的,不能很好地工作 - 它显示了很多误报。在您的情况下,它根本没有注意到geti()
总是返回2.
代码中的真正问题是*snapPts2 = snapPts[1];
使用未初始化的内存。这是因为_alloca
从堆栈中分配内存,但没有初始化它。