的小陣列爲什麼當我這樣做:STRCPY一個更大的串字符
char teststrcpy[5];
strcpy(teststrcpy,"thisisahugestring");
我得到的運行時間這條消息:
Abort trap: 6
它不應該只是覆蓋了在teststrcpy的記憶吧?如果不是,Abort陷阱的含義是什麼?
我用下MAC OSX
GCC編譯器作爲一個說明,並在回答一些意見,我做這個周邊Ç打,我不會去嘗試這樣做生產。你不擔心民謠! :)
感謝
的小陣列爲什麼當我這樣做:STRCPY一個更大的串字符
char teststrcpy[5];
strcpy(teststrcpy,"thisisahugestring");
我得到的運行時間這條消息:
Abort trap: 6
它不應該只是覆蓋了在teststrcpy的記憶吧?如果不是,Abort陷阱的含義是什麼?
我用下MAC OSX
GCC編譯器作爲一個說明,並在回答一些意見,我做這個周邊Ç打,我不會去嘗試這樣做生產。你不擔心民謠! :)
感謝
我沒有一個,但我讀過Mac OS以不同方式處理溢出,它不會允許您覆蓋內存incertian實例。 strcpy()
是其中之一
在Linux機器上,此代碼成功覆蓋下一個堆棧,但是由於stack canary而導致在mac os(中止陷阱)上阻止。
你也許能夠得到解決,與海灣合作委員會選項-fno-stack-protector
好吧,既然你看到從__strcpy_chk
中止,這將意味着它的具體檢查的strcpy(也可能是朋友)。所以,從理論上講,你可以做以下*:
char teststrcpy[5];
gets(teststrcpy);
然後輸入很長的字符串,它應該表現baddly如你所願。
*我只是建議gets
在這個特定的情況下,試圖繞過操作系統的保護機制。在其他情況下,我會建議任何人使用該代碼。 gets
是不是安全。
將問題的代碼構建到'main'例程中,在調試器中執行它,並顯示結果堆棧顯示'__strcpy_chk'調用的中止。使用「-fno-stack-protector」不會改變這一點。 (蘋果鐺4.0,默認選項,OSX 10.8.2。) –
@EricPostpischil - 很高興看到它確實是Mac OS ......你可以嘗試編輯過的建議,看看它是否適合你?我懷疑「操作系統保護」不適用於損壞/不安全的「gets」功能。 – Mike
用'gets',會得到分段錯誤;它似乎失敗了,因爲覆蓋緩衝區會改變重要數據,而不是因爲它被檢查機制所捕獲。但是,編譯期間會顯示警告:「警告:此程序使用gets(),這是不安全的。」 –
它不應該只是簡單地覆蓋的是在
teststrcpy
內存的吧?
不一定,它是未定義的行爲,寫入分配的內存之外。在你的情況,一些檢測出界外寫入和終止程序。
在C沒有人誰告訴你,「緩衝區太小」如果你堅持複製的字符太多的緩衝區太小,你將進入不確定的行爲TERRORITY
如果你想覆蓋什麼teststrcpy 5日焦炭之後,你是一個可怕的人。您可以大小爲4的字符串複製到teststrcpy(第五焦炭SHOLULD可以爲NULL保留)。
最有可能你的編譯器是使用緩衝區溢出保護金絲雀,因此,提高此異常時存在溢出,防止從緩衝區外寫入。
請參閱http://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries
您在使用什麼IDE/OS? – Mike
在寫入更多變量時,你期望它做什麼,而不是有空間? – wallyk
中止陷阱意味着操作系統檢測到一些錯誤,並且它終止了您的進程。最有可能的是,「只是重寫」重寫了一些它不應該被覆蓋的東西。 – 2013-01-22 19:30:46