正如你们中的一些人可能知道的那样,微软禁止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()
以及为什么它被弃用。有什么我看不到的常见用例吗?我在这里想念什么?