Я пытаюсь найти проблему в этом простом примере кода, который выдает «Предупреждение о переполнении буфера», и, посмотрев на него некоторое время, я решил опубликовать это в надежде, что кто-то увидит ошибку в моем коде?
Сообщение: Предупреждение C6386 Переполнение буфера при записи в ‘tmpArray’: размер записи равен ‘line.public: unsigned int __thiscall std :: basic_string, класс std :: allocator> :: length (void) const () * 12 * 4’ байтов, но ‘ 52 байта могут быть записаны.
Пример, который выдает предупреждение:
#define STEP 12
void main()
{
std::string line("Hello!");
float* tmpArray = new float[line.length() * STEP];
unsigned int v = 0;
for (unsigned int i = 0; i < line.length(); i++)
{
tmpArray[ v ] = 0.0f;
tmpArray[v + 1] = 0.0f;
tmpArray[v + 2] = 0.0f;
tmpArray[v + 3] = 0.0f;
tmpArray[v + 4] = 0.0f;
tmpArray[v + 5] = 0.0f;
tmpArray[v + 6] = 0.0f;
tmpArray[v + 7] = 0.0f;
tmpArray[v + 8] = 0.0f;
tmpArray[v + 9] = 0.0f;
tmpArray[v + 10] = 0.0f;
tmpArray[v + 11] = 0.0f;
v += STEP;
}
delete[] tmpArray;
}
Я не вижу, куда я вхожу в память, которая не принадлежит tmpArray, я имею в виду, что буфер распределяется точно на основе тех же значений, что и длина строки и размер шага.
Благодаря aschepler, который прокомментировал выше, решение этой проблемы оказалось скопировать значение, возвращаемое .length () в const unsigned int, а затем использовать его в обоих местах, например так:
const unsigned int lineLength = line.length();
Распределение:
float* tmpArray = new float[lineLength * STEP];
Для цикла:
for (unsigned int i = 0; i < lineLength; i++)
Других решений пока нет …