Re: [問題] strcpy的函數定義
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間15年前 (2011/07/01 11:11)推噓5(5推 0噓 32→)留言37則, 8人參與討論串4/4 (看更多)
※ 引述《tropical72 (藍影)》之銘言:
: ---------
: 我認為 strcpy 有個地方其實沒設計的很好
這東西是舊時代的產物了
現在寫 C++ 應該用 std::string
寫 C 的話就用 strncpy
不然就是平常多積些陰德吧
: 這段 code 會發生什麼事確實沒人會知道,
: 其實還是有極少機會會發生 - strcat 幾次、再 strcpy 就發生了,
: 大多都是出現 stack overflow 問題,
: 且這問題未必具有重現性,以我「僥倖」跑過後,得到的結果如下
: src:345678901234567890...
: des:123456789012345678901234567890...
: ptr:123456789012345678901234567890...
: 最後發現:用 strcpy 在這時候 (當然是我幹了傻事的結果),des!=src ,
: 更離譜的是,const src 也被吃掉了。而 ptr 卻仍沒防呆作用?
因為 src 和 des 都配置在 stack 上,而且 des 位於低位址
所以對 des 的寫入如果超出長度
就會寫到 src 上面
: assert(strcmp(strcpy(des, src), src);
: 還要再加這段的話,那幹嘛不一開始在有問題的時候就傳回 NULL,
: 還要硬指向 des?
這就是重點了...它的回傳值不是讓你判斷是否成功用的
因為 strcpy 接的是兩個 char* 而沒有這兩塊 buffer 的長度
所以它根本無法判斷字串複製是否會造成 buffer overrun
直接講結論
「不要用 null-terminated string 來儲存你的字串」
因為
1. 長度資訊很重要,而且經常會用到。一直用 strlen 會大幅降低效率
2. 不使用 null 來標示結尾,字串內容才能包含 null
: 嗯,我想 M$ 所有 _s 系列 (strcpy_s, strcmp_s...) 函式應是這樣出來的。
: 淺見,歡迎指正。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
→
07/01 11:14, , 1F
07/01 11:14, 1F
→
07/01 11:14, , 2F
07/01 11:14, 2F
推
07/01 11:37, , 3F
07/01 11:37, 3F
→
07/01 11:38, , 4F
07/01 11:38, 4F
→
07/01 11:39, , 5F
07/01 11:39, 5F
→
07/01 11:40, , 6F
07/01 11:40, 6F
→
07/01 11:43, , 7F
07/01 11:43, 7F
→
07/01 12:05, , 8F
07/01 12:05, 8F
→
07/01 12:09, , 9F
07/01 12:09, 9F
→
07/01 12:22, , 10F
07/01 12:22, 10F
推
07/01 12:28, , 11F
07/01 12:28, 11F
→
07/01 12:30, , 12F
07/01 12:30, 12F
→
07/01 12:30, , 13F
07/01 12:30, 13F
→
07/01 13:02, , 14F
07/01 13:02, 14F
→
07/01 13:04, , 15F
07/01 13:04, 15F
→
07/01 13:04, , 16F
07/01 13:04, 16F
推
07/01 13:12, , 17F
07/01 13:12, 17F
→
07/01 14:48, , 18F
07/01 14:48, 18F
推
07/01 15:48, , 19F
07/01 15:48, 19F
→
07/01 15:48, , 20F
07/01 15:48, 20F
→
07/01 15:49, , 21F
07/01 15:49, 21F
→
07/01 16:44, , 22F
07/01 16:44, 22F
→
07/01 16:45, , 23F
07/01 16:45, 23F
→
07/01 16:47, , 24F
07/01 16:47, 24F
→
07/01 16:48, , 25F
07/01 16:48, 25F
→
07/01 17:59, , 26F
07/01 17:59, 26F
→
07/01 18:17, , 27F
07/01 18:17, 27F
→
07/01 18:19, , 28F
07/01 18:19, 28F
推
07/01 18:33, , 29F
07/01 18:33, 29F
→
07/01 18:34, , 30F
07/01 18:34, 30F
→
07/01 19:05, , 31F
07/01 19:05, 31F
→
07/01 19:10, , 32F
07/01 19:10, 32F
→
07/01 23:36, , 33F
07/01 23:36, 33F
→
07/01 23:37, , 34F
07/01 23:37, 34F
→
07/01 23:58, , 35F
07/01 23:58, 35F
→
07/02 00:02, , 36F
07/02 00:02, 36F
→
07/02 16:00, , 37F
07/02 16:00, 37F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章