檢測到堆棧粉碎我正在執行我的a.out文件。執行后程序運行一段時間然后退出并顯示以下消息:**** stack smashing detected ***: ./a.out terminated**======= Backtrace: =========**/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*可能的原因是什么?如何糾正?
3 回答

MM們
TA貢獻1886條經驗 獲得超2個贊
這里的Stack Smashing實際上是由于gcc用來檢測緩沖區溢出錯誤的保護機制引起的。例如,在以下代碼段中:
#include <stdio.h>void func(){ char array[10]; gets(array);}int main(int argc, char **argv){ func();}
編譯器(在本例中為gcc)添加了具有已知值的保護變量(稱為canaries)。大小大于10的輸入字符串會導致此變量損壞,從而導致SIGABRT終止程序。
為了獲得一些見解,您可以嘗試 -fno-stack-protector
在編譯時使用選項禁用gcc的這種保護 。在這種情況下,當您嘗試訪問非法內存位置時,您將收到不同的錯誤,很可能是分段錯誤。請注意,-fstack-protector
應始終為發布版本打開,因為它是一種安全功能。
您可以通過使用調試器運行程序來獲取有關溢出點的一些信息。Valgrind與堆棧相關的錯誤不能很好地工作,但是像調試器一樣,它可以幫助你精確定位崩潰的位置和原因。
- 3 回答
- 0 關注
- 816 瀏覽
添加回答
舉報
0/150
提交
取消