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)時會報錯,但是這時報出來的錯誤已經面目全非了。 所有像這種問題,還是需要仔細看代碼的。