代碼中的錯誤在buf = malloc(1)之後,爲什麼在buf [16]被覆蓋之前不會拋出guard頁面異常?
int main() { void *ptr = 0; int overrun = 1; ptr = malloc(overrun); while(overrun++) { if(!ptr) while(1) Sleep(500); *((char*)ptr + (overrun+1)) = 'a'; printf("\n%d\n",overrun); } return 0; }
從Visual Studio 2010的項目菜單確信的版本是 「釋放」 和 「64」(機X64)
啓用整頁堆
gflags /p /enable test.exe /full
製作的WinDbg默認調試
E:\installed\Debugging Tools for Windows (x64)>windbg -I
運行代碼從
cmd
單獨的EXE而不調試器輸出:
2 3 4 5 6 7 8 9 10 11 12 13 14
之後windbg中看出捕捉腐敗。我認爲整頁堆是假設立即發現腐敗。
任何意見,爲什麼整頁堆很爛?
回答
由於需要堆分配給對準,不交叉的取向邊界不能在發生超限因爲存儲器保護是頁粒狀,不字節粒狀的時間被捕獲的膨脹率。這是一個硬件限制。釋放內存時會檢測到溢出並檢查尾部字節是否被篡改。
(順便說一句,說的東西很爛使得它不太可能你指責吸吮的人會費心幫助你解決問題。只是一個提示。)
如果您使用'/ unaligned',那麼您告訴堆放棄其對齊要求。如果你這樣做了,那麼你最終可以以字節爲單位,但它也會打破堆合約。 (例如,使用SSE的代碼可能會由於錯位導致崩潰。)如果您可以忍受這種規則破壞,那就堅持下去。 –
omg,你的意思是SSE指令調用者會盲目地使用內存指針而不檢查對齊要求嗎? – user1813004
malloc從CRT堆(Windows)不授予任何對齊,SSE語句因此是假的 – user1813004
要在雷蒙德的響應擴大。如果你在調試器中查看通過malloc返回的原始指針,你會發現它在頁面末尾有16個字節。這是因爲x64上的HeapAlloc對齊要求是16字節。所以它把你要求的1個字節儘可能地放在頁面的末尾。一旦你離開你錯誤的頁面的末尾。
- 1. 爲什麼異常不會被拋出?
- 2. 爲什麼FileInfo.OpenWrite()在FileInfo.Create()之後直接調用時會拋出異常?
- 3. 在iOS中,buf返回的類型是什麼?'sysctlbyname(「net.inet.tcp.pcblist」,buf,&len,0,0)'?
- 4. 爲什麼Mockito不會拋出異常?
- 5. 爲什麼buf的大小從4更改爲1
- 6. 該行的含義:buf =((buf << 11)|(buf >>> 21));
- 7. 爲什麼java拋出異常java.lang.ArrayIndexOutOfBoundsException:1
- 8. 結果不同;的recv(襪子,BUF,的sizeof(BUF),0)和strlen的(BUF)中的C++
- 9. * BUF ++ = *的buf + 10 - 最後一個表達式的解釋
- 10. arithemetic異常被拋出,但爲什麼?
- 11. 爲什麼這個異常不會被拋出?
- 12. 爲什麼在Activity.onRestart()之後SQLiteQueryBuilder在computeProjection()中拋出一個NullPointerException異常?
- 13. 在finally塊中拋出異常之後返回值會發生什麼?
- 14. 爲什麼會resources.getStringArray(int)拋出異常?
- 15. 爲什麼BeanUtils.copyProperties會拋出IllegalArgument異常?
- 16. 爲什麼這會拋出異常?
- 17. 哈希值不存在時,爲什麼不會拋出異常?
- 18. System.out.println()不拋出異常,但System.in.read()拋出異常,爲什麼?
- 19. DMA BUF共享
- 20. 爲什麼在索引1中沒有元素時,不會拋出java.lang.StringIndexOutOfBoundsException異常?
- 21. 爲什麼拋出後臺線程中的ProgressDialog時不會拋出異常?
- 22. 如何在vim中退出buf
- 23. 爲什麼ComboBox在設置DataSource時不會拋出異常?
- 24. 爲什麼Spring在Hibernate拋出ObjectNotFoundException異常時不拋出DataAccessException?
- 25. SaveChanges()在拋出異常之前不起作用
- 26. 的ModelForm與覆蓋拋出ValueError異常
- 27. 爲什麼在這裏拋出異常?
- 28. 爲什麼Response.Write會顯示在頁面上的控件之前?
- 29. 爲什麼配置對象在使用後不拋出異常?
- 30. 當未捕獲的異常被拋出時不會生成Emma代碼覆蓋
有人嗎? 或者我應該問「heapoverrun.com」 得到它XD – user1813004