推 Ebergies: 不要學 strcpy, strncpy, 這只會增加你寫出 bug 的機率 01/26 12:42
→ HILL33LOVE: 恩 現在都用snprintf 只是好奇為什麼src的位置會變 01/26 13:10
→ azureblaze: 給你五個格子你硬要塞10個東西進去壞掉了很奇怪嗎? 01/26 13:26
→ wenyonba: 有時候我也覺得過於追求這種不合法動作的原理其實沒必要 01/26 13:32
→ azureblaze: 這類的問題如過需要問"為什麼"那就不需要知道"為什麼" 01/26 13:36
→ azureblaze: 知道不要這樣胡搞就夠了 01/26 13:36
→ azureblaze: 有能力應用這種胡搞的人不會問這個問題 01/26 13:37
推 anyoiuo: 把src的Address(&src)印出,在思考strcpy原型程式碼 01/26 15:05
→ anyoiuo: 你就會發現*s1++會剛好修改到&src位址所存放的值 01/26 15:06
→ anyoiuo: 目標記憶體比較小時會造成修改到不應更改的記憶體區塊 01/26 15:09
推 Bencrie: 你的 dest 要 6 個 char 01/26 17:45
→ shadow0326: 13戒之2 01/26 18:17
→ TobyH4cker: overflow 01/26 18:48
→ TobyH4cker: 我也同意刻意研究這個沒什麼意義,因為本身就是不合法 01/26 18:53
→ TobyH4cker: 真想知道,要學的已經不是程式語言,而是資料結構, 01/26 18:54
→ TobyH4cker: 還有逆向工程,你才會知道說local variable在stack中 01/26 18:55
→ TobyH4cker: 是如何推疊的,才會知道overflow為什麼會改變ptr addr 01/26 18:56
→ TobyH4cker: 所以「有能力應用這種胡搞的人不會問這個問題」。 01/26 18:56
推 dirkc: 我比較好奇的是為什麼你的address不是4的倍數 01/26 21:08
→ azureblaze: char本來就沒alignment 01/27 00:16
→ dirkc: src是global address 01/27 08:01
→ dirkc: 除非"ABCDE"也放到global(怪?),或沒貼出來的code還有什麼 01/27 08:05
→ dirkc: 另一怪是dest是較小位址,方便問一下你的gcc版本和編譯參數? 01/27 08:47
→ anyoiuo: src正確應是const char * = "1234567890";' 01/27 10:03
→ anyoiuo: 位址大小問題是因為他不是存在Stack與Heap 01/27 10:04
→ dirkc: 回樓上,dest在stack中比&src要小所以執行strcpy才會蓋到src 01/27 14:38
→ dirkc: 從src=8040030看來後面0030是'0'和'\0',所以&src=bffa7e5c 01/27 14:42
→ dirkc: 老gcc常把先宣告的dest放在stack底層就是高位址 01/27 14:43
→ dirkc: 年輕gcc容易把char[?]放在stack底層,也是高位址 01/27 14:44
→ dirkc: 但是現在dest是低位址,所以我覺得有趣 01/27 14:45
→ dirkc: &"1234567890"應該是在.data,沒別的原因應該不會配奇數位址 01/27 14:54