Как решить предупреждение C6386? - PullRequest
0 голосов
/ 25 октября 2019

Я пишу простой код для чтения систематизированных данных из файла .txt и получил предупреждение «C6386: переполнение буфера при записи в« точки »: размер записи составляет« num * 8 »байтов, но« 16 »байтовможет быть написано ". Как решить это в моем случае? Код прилагается.

struct point {
    int x, y;
};

void main()
{
    fstream file;
    point* points;
    int num, 
        i = 0;

    file.open("C:\\Users\\Den\\Desktop\\file.txt", fstream::in);
    if (!file.is_open()) {
        cout << "No file found\n";
        exit(1);
    }
    else {
        file >> num;
        points = new point[num];
    }

    while (file >> num) {
        points[i].x = num;   // <- here
        file >> num;
        points[i].y = num;
        i++;
    }

    file.close();
}

1 Ответ

1 голос
/ 25 октября 2019

Это просто предупреждение, но оно дает хороший совет. Какой это файл содержит более num элементов? Предупреждение говорит вам, что вы должны убедиться, что вы не пишете после конца массива. В частности:

Это предупреждение указывает, что доступный для записи экстент указанного буфера может быть меньше, чем индекс, используемый для записи в него. Это может вызвать переполнение буфера. [msdn]

Этот код не выдает предупреждение (VS2019):

int x, y;
while (i < num && (file >> x >> y)) {
    points[i].x = x;
    points[i].y = y;
    i++;
}

Еще больше проверки ошибокдобавить. Что делать, если file >> num; не удается? Что если num отрицательно? Что если points = new point[num]; не удастся (вернет nullptr)?

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