Переполнение буфера с использованием вектора - PullRequest
0 голосов
/ 23 января 2020
unsigned short* myClass::get_last(size_t _last) const
{
    if (_last == 0) _last = last.size();
    if (_last <= last.size())
    {
        unsigned short* temp = new unsigned short [_last] {};
        while (_last > 0) temp[_last] = last[last.size() - _last--]; //I get a warning HERE
        return temp;
    }
    throw std::runtime_error("Error!");
}

Там написано:

Переполнение буфера при записи в 'temp': размер записи составляет '_last * 2' байтов, но может быть записано '_last' байтов.

Что это значит? Я точно знаю, что _last не больше, чем temp.size () из-за if, что мне делать?

Он отлично работает во время выполнения , но я ненавижу иметь предупреждения, которые делают мой код менее понятным для другого пользователя или для меня в будущем.


РЕДАКТИРОВАТЬ: _last - это аргумент, данный пользователем во время выполнения, так что в конечном итоге оно может иметь любое значение, но если его значения выходят за пределы диапазона, вы получаете исключение (управляемое в другой функции).

Вектор, который я упомянул в заголовке, - last То есть член myClass .

Я знаю, что элементы массива go от 0 до _last - 1 , и именно поэтому я уменьшаю _last , прежде чем использовать его в первый раз (как вы, вероятно, знаете, ассоциативность назначений справа налево).


Надеюсь, я ответил на все ваши комментарии ;)

Ответы [ 2 ]

1 голос
/ 23 января 2020

Проблема в том, что C ++ индексирует массивы, начиная с 0. Таким образом, массив размера 4 имеет допустимые индексы 0, 1,2 и 3.

Но вы выделяете массив размера _last:

unsigned short* temp = new unsigned short [_last] {};

и затем запись в temp[_last]. Это один за пределы размера массива.

0 голосов
/ 23 января 2020

Решено с помощью Векторов!

std::vector<unsigned short> Tombola::get_last(size_t _last) const
{
    if (_last == 0) _last = last.size();
    if (_last <= last.size())
    {
        std::vector<unsigned short> temp(_last);
        while (_last > 0) temp[_last] = last[last.size() - _last--];
        return temp;
    }
    throw std::runtime_error("Error!");
}

Почему-то они всегда решают все проблемы, даже если вы не знаете, как;)

...