正如一些人可能已经知道的那样,微软已经将memcpy()
从他们的安全开发生命周期中禁止使用,并用memcpy_s()
替代。
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));
与
(void)memcpy_s(dst, dst_len, src, src_len);
问题:额外的长度参数如何使代码更安全?要使用memcpy()
,我应该已经知道所有四个参数并将适当的长度作为第三个参数传递。什么阻止我犯同样的错误,即计算目标缓冲区大小时出现误差,并传递错误的dst_size
值?我看不出它与memcpy()
有任何不同,也不明白为什么它正在被弃用。是否有任何常见的用例是我没有考虑到的?我在这里漏掉了什么?
__STDC_LIB_EXT1__
时才使用它。Redhat建议将其从未来的C规范中删除。 - DavidJ