C語言基礎
void save(const char *input) {
char name[8];
strcpy(name, input);
printf("%s\n", name);
}把8個字元的字串 "ABCDEFGH" 傳給上方的函式 save。會發生的事,下列何者正確?
- A包含結尾的 '\0' 共寫入9位元組,破壞 name 外側的1位元組(未定義行為)
- B剛好8個字元,因此放得進 name,正確顯示 ABCDEFGH
- Cstrcpy 依 name 的大小截斷為7個字元,並在最後一個元素放入結尾的 '\0'
查看答案與解析
正確答案:A. 包含結尾的 '\0' 共寫入9位元組,破壞 name 外側的1位元組(未定義行為)
字串 "ABCDEFGH" 包含結尾的 '\0' 共9位元組。strcpy 不知道寫入目的地的大小,會把到 '\0' 為止的內容全部複製,因此會超出8位元組的 name,向外寫入1位元組(緩衝區溢位)。超出的部分可能破壞堆疊上的其他變數或返回位址,也被用於給予很長的輸入以執行任意程式碼的攻擊。應使用能指定寫入大小的函式來預防,例如 snprintf(name, sizeof name, "%s", input)。
- A. 正確。第9個位元組的 '\0' 被寫到陣列外。
- B. 8個字元的字串需要包含結尾 '\0' 的9位元組。
- C. strcpy 不知道寫入目的地的大小,因此不會截斷。