如果尝试使用功能,请获取警告C6385

时间:2018-05-24 12:36:22

标签: c++ visual-studio c++11 c++-cli warnings

如果我尝试在以下代码中使用函数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;
}

非常感谢一个很好的答案。

由于

1 个答案:

答案 0 :(得分:1)

消息来自Visual Studio的静态代码分析器,而不是编译器。分析仪是相对较新的,不能很好地工作 - 它显示了很多误报。在您的情况下,它根本没有注意到geti()总是返回2.

代码中的真正问题是*snapPts2 = snapPts[1];使用未初始化的内存。这是因为_alloca从堆栈中分配内存,但没有初始化它。