@Vitaliy2112

Как убрать предупреждение от Visual studio?

Пишу 2д игру, в игре есть функция на добавление пули в массив, мне не даёт покоя предупреждение от Visual studio

То самое предупреждение
Предупреждение C6386 Переполнение буфера при записи в "bullets_t".

struct Bullet {
    float x = 0;
    float y = 0;
};


Вот функция
void shoot() {
    if (player.x + 2 > mWidth) return;

    Bullet* bullets_t = new Bullet[bulletsNumber + 1];

    for (int i = 0; i < bulletsNumber; i++) {
        bullets_t[i] = bullets[i];
    }

    bullets_t[bulletsNumber] = { player.x + 2, player.y };

    delete[] bullets;

    bullets = bullets_t;
    bulletsNumber++; 
}


64c80a4b77ddc792933027.png
  • Вопрос задан
  • 231 просмотр
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Достаточно загуглить номер ошибки, чтобы из гугля посыпались "Code analysis false positive - C6386". Баг это.
А весь приведенный код нужно выбросить и заменить восемь строчек говнокода на один push_back стандартного вектора.
Ответ написан
Комментировать
@MasterGod
Предупреждение C6386 указывает на потенциальное переполнение буфера при записи в массив `bullets_t`. Это может произойти, если `bulletsNumber` равно нулю или отрицательному числу.

Чтобы избежать этого предупреждения следует добавить проверку перед созданием массива `bullets_t`. Если оказывается равным нулю или отрицательным то необходимо изменять это значение на другое,


void shoot() {
if (player.x + 2 > mWidth) return;

Bullet* bullets_t;

if (bulletsNumber <= 0) {
bullets_t = new Bullet[1];
bulletsNumber = 1;
} else {
bullets_t = new Bullet[bulletsNumber + 1];
for (int i = 0; i < bulletsNumber; i++) {
bullets_t[i] = bullets[i];
}
bulletsNumber++;
}

bullets_t[bulletsNumber - 1] = { player.x + 2, player.y };

delete[] bullets;
bullets = bullets_t;
}


struct Bullet {
    float x = 0;
    float y = 0;
};

void shoot() {
    if (player.x + 2 > mWidth) return;

    Bullet* bullets_t = new Bullet[bulletsNumber + 1];

    for (int i = 0; i < bulletsNumber; i++) {
        bullets_t[i] = bullets[i];
    }

    bullets_t[bulletsNumber] = { player.x + 2, player.y };

    delete[] bullets;

    bullets = bullets_t;
    bulletsNumber++; 
}

Теперь предупреждение должно исчезнуть
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы