[問題] 使用strcpy, strcat不必在意size嗎?

看板C_and_CPP作者 (Zoxge)時間8年前 (2017/04/08 19:42), 編輯推噓9(9014)
留言23則, 13人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 問題(Question): 小弟最近重新閱讀C++ primer 看到Section 4.3講到C-Style字元字串,其中有一段寫到 "傳給strcat()和strcpy()作為第一引數的那個array,必須大得足以存放產生出的字串。" 於是寫了一小段code測試一下 (如下網址) 但有個疑惑實在想不透.. 一開始char array s只給了size為6 bytes 為什麼用strcpy與strcat把s塞了超過size 6 bytes,這樣還是不會出現問題呢? (做過strcpy與strcat後,sizeof(s)明明還是6 bytes呀) 想請高手指點一下疑惑,感謝! 程式碼(Code):(請善用置底文網頁, 記得排版) https://ideone.com/GtckIA -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.228.65 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1491651721.A.883.html

04/08 20:02, , 1F
那只是你運氣沒爆
04/08 20:02, 1F

04/08 20:02, , 2F
上面少了一個好字
04/08 20:02, 2F

04/08 21:07, , 3F
strcpy 只是把東西從目標位置開始放,滿出來他也是會
04/08 21:07, 3F

04/08 21:07, , 4F
放完,但已經動到本來不該動到的東西了,而size 在co
04/08 21:07, 4F

04/08 21:07, , 5F
mpile time 就已經決定了
04/08 21:07, 5F

04/08 21:14, , 6F
所以win上會強迫要strcpy_s 和 strcat_s
04/08 21:14, 6F

04/08 21:15, , 7F
就是避免這種錯誤 程式只要一大 這都會有問題
04/08 21:15, 7F

04/08 22:27, , 8F
你需要 rust
04/08 22:27, 8F

04/08 22:29, , 9F
https://goo.gl/QbH8Hg strncpy 是很難使用好的函式
04/08 22:29, 9F

04/08 23:06, , 10F
沒效能問題還是別用c string 很多眉角
04/08 23:06, 10F

04/08 23:51, , 11F

04/08 23:52, , 12F
C11給字串或記憶體操作的標準函式都加了安全版(_s字尾)
04/08 23:52, 12F

04/08 23:52, , 13F
只要你的編譯器附的標準函式庫有實作,儘可能使用它們。
04/08 23:52, 13F

04/09 00:34, , 14F
你的stack frame上還有其他東西,沒蓋到stack guard(有
04/09 00:34, 14F

04/09 00:34, , 15F
開保護的話)或是ebp或是ret address,所以看似沒問題
04/09 00:34, 15F

04/09 00:37, , 16F
詳情可以研究stack based buffer overflow或稱stack sma
04/09 00:37, 16F

04/09 00:37, , 17F
hing,更深入還可以練習拿shell
04/09 00:37, 17F

04/09 12:30, , 18F
感謝各位!!
04/09 12:30, 18F

04/09 12:43, , 19F
這就是memory問題最頭痛的點 它不一定會馬上爆
04/09 12:43, 19F

04/11 10:41, , 20F
運氣問題,不過迴避硬塞應該是RD自己該注意的吧
04/11 10:41, 20F

04/11 12:15, , 21F
不需要在意輸入字串長度的大概就 strdup ㄅ
04/11 12:15, 21F

04/11 18:42, , 22F
strdup 有另一個問題是要記得 free 它
04/11 18:42, 22F

04/19 02:52, , 23F
使用string就沒問題了吧?
04/19 02:52, 23F
文章代碼(AID): #1OwCo9Y3 (C_and_CPP)