有些人可能知道,Microsoft banned memcpy()
from their Security Development Lifecycle,用memcpy_s()
替換它。Microsoft SDL和memcpy depobation
void *memcpy(void *dest, const void *src, size_t n);
/* simplified signature */
errno_t memcpy_s(void *dst, size_t dstsize, const void *src, size_t n);
所以,如果用你的代碼是:
if (in_len > dst_len) {
/* error */
}
memcpy(dst, src, in_len);
就變成:
if (memcpy_s(dst, dst_len, src, src_len)) {
/* error */
}
或者,用截斷,
memcpy(dst, src, min(in_len, dst_len));
VS
(void)memcpy_s(dst, dst_len, src, src_len);
問題:一個額外的長度參數如何使代碼更安全?要使用memcpy()
,我應該已經知道所有四個參數,並將適當的長度作爲第三個參數。什麼阻止了我錯誤地計算目標緩衝區大小和傳遞錯誤值dst_size
?我不明白爲什麼它與memcpy()
有什麼不同,以及它爲什麼會被棄用。有沒有我看不到的常見用例? 我在這裏錯過了什麼?
閱讀類似的東西,請記住,memcpy_s()是C11附錄K,這是唯一一個的一部分*可選* C11規範的一部分。有幾個編譯器實現者拒絕了附件K,並且永遠不會實現它。所以,只有在定義'__STDC_LIB_EXT1__'時才使用它。 Redhat建議將它從未來的C規範中刪除。 – DavidJ 2017-01-31 22:30:27