Как некоторые из вас могут знать, Microsoft запретила 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()
и почему он устарел. Есть ли какой-либо общий вариант использования, который я не вижу? Что мне здесь не хватает?