1

我试图在这个产生“缓冲区溢出警告”的简单示例代码中找到问题,在查看了一段时间后,我决定发布这个问题,希望有人可能会在我的代码中看到错误?

消息:警告 C6386写入 'tmpArray' 时缓冲区溢出:可写大小为 'line.public: unsigned int __thiscall std::basic_string,class 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 的内存的位置,我的意思是缓冲区是根据与字符串长度和步长相同的值精确分配的。

4

1 回答 1

0

感谢上面评论的 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++)
于 2018-02-01T14:44:56.573 回答