Получение предупреждения C6385, если попытаться использовать функцию - PullRequest
0 голосов
/ 24 мая 2018

Я получаю это предупреждение, если пытаюсь использовать функцию 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

, я не смогу получить предупреждение.Я не могу понять сценарий, что то, что там происходит, я много гуглил, но не смог найти решение.Я новичок в C ++, прошу прощения за ошибку в написании и помогите мне понять это.

Примечание.* Я использую следующий код

#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 голосов
/ 25 мая 2018

Сообщение приходит от статического анализатора кода Visual Studio, а не от компилятора.Анализатор является относительно новым и не очень хорошо работает - он показывает много ложных срабатываний.В вашем случае он просто не заметил, что geti() всегда возвращает 2.

Реальная проблема в вашем коде состоит в том, что *snapPts2 = snapPts[1]; использует неинициализированную память.Это связано с тем, что _alloca выделяет память из стека, но не инициализирует ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...