2013-01-22 98 views
4

的小陣列爲什麼當我這樣做:STRCPY一個更大的串字符

char teststrcpy[5]; 

strcpy(teststrcpy,"thisisahugestring"); 

我得到的運行時間這條消息:

Abort trap: 6 

它不應該只是覆蓋了在teststrcpy的記憶吧?如果不是,Abort陷阱的含義是什麼?

我用下MAC OSX

GCC編譯器作爲一個說明,並在回答一些意見,我做這個周邊Ç打,我不會去嘗試這樣做生產。你不擔心民謠! :)

感謝

+0

您在使用什麼IDE/OS? – Mike

+0

在寫入更多變量時,你期望它做什麼,而不是有空間? – wallyk

+0

中止陷阱意味着操作系統檢測到一些錯誤,並且它終止了您的進程。最有可能的是,「只是重寫」重寫了一些它不應該被覆蓋的東西。 – 2013-01-22 19:30:46

回答

1

我沒有一個,但我讀過Mac OS以不同方式處理溢出,它不會允許您覆蓋內存incertian實例。 strcpy()是其中之一

在Linux機器上,此代碼成功覆蓋下一個堆棧,但是由於stack canary而導致在mac os(中止陷阱)上阻止。

你也許能夠得到解決,與海灣合作委員會選項-fno-stack-protector


好吧,既然你看到從__strcpy_chk中止,這將意味着它的具體檢查的strcpy(也可能是朋友)。所以,從理論上講,你可以做以下*:

char teststrcpy[5]; 
gets(teststrcpy); 

然後輸入很長的字符串,它應該表現baddly如你所願。

*我只是建議gets在這個特定的情況下,試圖繞過操作系統的保護機制。在其他情況下,我會建議任何人使用該代碼。 gets是不是安全。

+0

將問題的代碼構建到'main'例程中,在調試器中執行它,並顯示結果堆棧顯示'__strcpy_chk'調用的中止。使用「-fno-stack-protector」不會改變這一點。 (蘋果鐺4.0,默認選項,OSX 10.8.2。) –

+0

@EricPostpischil - 很高興看到它確實是Mac OS ......你可以嘗試編輯過的建議,看看它是否適合你?我懷疑「操作系統保護」不適用於損壞/不安全的「gets」功能。 – Mike

+0

用'gets',會得到分段錯誤;它似乎失敗了,因爲覆蓋緩衝區會改變重要數據,而不是因爲它被檢查機制所捕獲。但是,編譯期間會顯示警告:「警告:此程序使用gets(),這是不安全的。」 –

2

它不應該只是簡單地覆蓋的是在teststrcpy內存的吧?

不一定,它是未定義的行爲,寫入分配的內存之外。在你的情況,一些檢測出界外寫入和終止程序。

2

在C沒有人誰告訴你,「緩衝區太小」如果你堅持複製的字符太多的緩衝區太小,你將進入不確定的行爲TERRORITY

0

如果你想覆蓋什麼teststrcpy 5日焦炭之後,你是一個可怕的人。您可以大小爲4的字符串複製到teststrcpy(第五焦炭SHOLULD可以爲NULL保留)。

相關問題