dev*_*roy 0 c++ buffer-overflow
我有以下用C++编写的代码来提取片表数据结构中的给定范围的文本.以下是类PieceTable的函数,它将给定范围的文本存储在字符数组中buffer:
void PieceTable::getTextInRange(unsigned __int64 startPos, unsigned __int64 endPos, char buffer[]){
char* totalBuffer = new char[getSize() + 2];
getBuffer(totalBuffer);
if(endPos >= getSize())
endPos = getSize() - 1;
cout<<"startPos : "<<startPos<<endl;
cout<<"endPos : "<<endPos<<endl;
memcpy(buffer, &totalBuffer[startPos], endPos - startPos + 1);
buffer[endPos - startPos + 2] = '\0';
if(totalBuffer != 0)
delete[] totalBuffer;
totalBuffer = 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我用来测试这段代码的main方法中的一段代码:
temp2 = new char[end - start + 2]; //changing 2 to 3 solves the problem
pieceTable.getTextInRange(Start, end, temp2);
for(int i = 0; i< end - start + 1; i++)
cout<<temp2[i];
cout<<endl;
if( temp2 != 0)
{
delete[] temp2; //this line causes the heap corruption error
temp2 = 0;
}
Run Code Online (Sandbox Code Playgroud)
声明temp2:
char* temp2;
只要程序遇到该delete[] temp2语句,就会出现堆损坏错误.如果我为temp2分配内存,则不会出现这样的问题:
temp2 = new char[end - start + 3]
因此,基本上改变长度可以解决问题.我知道我在某处弄乱了长度,但我无法弄清楚在哪里.
编辑:getSize():
__int64 PieceTable::getSize()
{
return dList.getLength(dList.getBack());
}
Run Code Online (Sandbox Code Playgroud)
我正在使用一个表数据结构.在这篇文章中,它是:http://www.cs.unm.edu/~crowley/papers/sds.pdf
我可能错了,但我认为没有任何问题getSize(),因为我用来检索整个缓冲区长度的函数getBuffer,如代码所示.
在PieceTable::getTextInRange,你有这样一行:
buffer[endPos - startPos + 2] = '\0';
Run Code Online (Sandbox Code Playgroud)
当你分配你传递的东西时,你buffer像这样分配:
temp2 = new char[end - start + 2];
Run Code Online (Sandbox Code Playgroud)
让我们看一些实数......
buffer[5 - 2 + 2] = '\0';
temp2 = new char[5 - 2 + 2];
Run Code Online (Sandbox Code Playgroud)
这相当于:
buffer[5] = '\0';
temp2 = new char[5];
Run Code Online (Sandbox Code Playgroud)
好吧,这是你的问题.如果这样,new char [5]您将获得一个具有0到4之间有效索引的数组.5不是此数组的有效索引.
可能我建议你制定一个规则,你只能在最常见的情况下打破,你总是像STL那样用[开始,结束]来指定范围.这意味着您指定一个超过最后一个所需索引的结尾.这使得范围计算数学更容易出错.此外,界面与STL工作方式的一致性使其更易于使用.例如,计算范围的大小始终end - begin采用此方案.
EW Dijkstra有一篇旧的(大约1982年)论文给出了一些很好的理由,说明为什么这种表达范围的方案是最好的.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |