回答
您的假設是錯誤的,因爲在未映射到進程地址空間的地址處讀取內存將導致SEGV
。特別是讀取地址0(在幾乎所有的體系結構上),並讀取內核內存空間(如果它甚至映射到內存空間),但通常讀取沒有物理內存映射爲可讀的邏輯內存。
在您的示例中,您正在對未分配的字節運行memcmp
,這是未定義的行爲。它可能會從堆棧或數據段中讀取垃圾,但是您無法知道這一點。例如,d
可能正好位於堆棧的頂部,因此您可能會超出堆棧頂部而進入未映射的內存(堆棧通常會向下增長)。
「從堆棧或數據段中讀取垃圾」/「'd'可能正好位於堆棧頂部」 - 它本身在哪裏並不重要,因爲它是'memcmp()'所做的讀取存儲在'd'中的地址是危險的 - 我們知道它已經被設置爲一個永遠不會在堆棧中的字符串 - 傳統上它在數據段中。 –
不像託尼說的那樣,只能在只讀部分中分配「d」的內存而不在函數堆棧中分配內存? –
'd'是一個指針('char *'),所以'd'本身不會被讀取。 'd'指向的數據可能位於只讀存儲器中,或者可能位於可寫區域;您無法保證它在哪裏或者它的可寫性如何,並且沒有什麼可以阻止編譯器將它放在堆棧的頂部。重點是超出它的讀數是不確定的。 – abligh
- 1. 是否有可能從引用中產生分段錯誤?
- 2. 可能錯誤地使用了內存 - 分段錯誤
- 3. 未知的分段錯誤可能與內存分配有關
- 4. 讀取python中的zip文件時發生內存錯誤
- 5. 在openmp中讀取數據時是否發生錯誤共享?
- 6. 是否有可能讀取PHP進程的整個內存?
- 7. LoadIcon()是否可能發生內存泄漏?
- 8. 是否valgrind防止發生段錯誤我想調試發生?
- 9. Myshell分段錯誤,獲取輸入可能存在問題?
- 10. 分段錯誤,未分配內存
- 11. 內存分配中的分段錯誤
- 12. 釋放分配的內存會生成分段錯誤
- 13. Lisp奇怪的分段錯誤很可能是eval錯誤
- 14. C++,讀取文件,分段錯誤
- 15. 分段錯誤讀取json字符串
- 16. 調用gdk_rgba_to_string()時發生分段錯誤
- 17. 在讀取數據文件時發生段錯誤
- 18. 讀取任意內存位置?可能?
- 19. Javascript可能會發生內存泄漏
- 20. 在內存中緩存位圖數據時發生錯誤分配錯誤
- 21. 指針,內存不足,分段錯誤?
- 22. 無法訪問內存,分段錯誤
- 23. 泄漏的內存,分段錯誤,C
- 24. Mac上的lldb內存讀取錯誤
- 25. 讀取URL的Web服務器內容時發生錯誤
- 26. 我想在發生錯誤時讀取另一個內核
- 27. eu-west-1 AWS'無法讀取標籤:發生內部錯誤'
- 28. 功能是否有可能在Golang中發生錯誤的裸機?
- 29. cl C++在讀取無法訪問的內存時發生運行時錯誤
- 30. Python ctypes - 調用DLL中的函數時發生內存讀取錯誤
memcmp(0,0,10)將segfault ...它假定指針參數指向程序中的有效內存。 – amdn
@amdn,我不確定「意志」,因爲行爲有些不確定。 –
@ s.bandara你是對的,它是未定義的行爲,但它在我知道的每個系統上都有錯誤。 – amdn