程序的主要逻辑如下:
int fd;
int size = 0;
int bytes = 0;
if (openFile(filename, fd, size)) {
char* buffer = new char[size];
if ((bytes = ::read(fd, buffer, size))) { ...}
for (int i=0; i<bytes; i++) {
if (i==(bytes-1)) {
1) buffer[i+1] = '\0'; //这里数组越界
}
...
2) string fileStr(linePointer);
}
...
3) delete[] buffer;
}
因为是公司内部的代码,所以不能贴出详细的代码。
上面的代码运行时,会在1)处访问超出数组buffer的边界,因为在C++中数组下标时从0开始的,所有array[array.length]会越界。
但是在具体的运行时,会出现奇怪的问题。
有时会在2)处抛出:
glibc detected program: malloc(): memory corruption (fast):
0x00002aaabd0c3650 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3e99a73b1c]
/lib64/libc.so.6(__libc_malloc+0x6e)[0x3e99a74e4e]
/usr/lib64/libstdc++.so.6(_Znwm+0x1d)[0x3e9eabd1dd]
/usr/lib64/libstdc++.so.6(_ZNSs4_Rep9_S_createEmmRKSaIcE+0x21)[0x3e9ea9b861]
/usr/lib64/libstdc++.so.6[0x3e9ea9c365]
/usr/lib64/libstdc++.so.6(_ZNSsC1EPKcRKSaIcE+0x42)[0x3e9ea9c512]
…
有时会在3)处抛出:
glibc detected program: double free or corruption (!prev):
0x0000000018553af0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3e99a7247f]
/lib64/libc.so.6(cfree+0x4b)[0x3e99a728db]
…
刚开始的时候,像这种同一个代码段,在运行多次时,会在不同的地方出错,我以为时多线程问题,
后来一看代码,根本就没有多线程,所有否定。
再仔细看代码下,发现错误,内存访问越界。
所有我猜测,当C++中出现内存访问越界时,有可能会立即报错,也有可能在下一次/下下一次(在它的附近)
的内存访问(new or delete)时会报错,但是这时报出来的错误已经面目全非了。
所有像这种问题,还是需要仔细看代码的。