Как вы знаете, Microsoft banned memcpy()
from their Security Development Lifecycle, заменив его на memcpy_s()
.Отказ Microsoft SDL и memcpy
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()
и почему он устарел. Есть ли какой-либо общий вариант использования, который я не вижу? Что мне здесь не хватает?
Имейте в виду, что memcpy_s() является частью C11 приложения К, что только * продается отдельно * часть C11 спецификация. Некоторые разработчики компиляторов отклонили Приложение K и никогда не будут реализовывать его. Поэтому используйте его только в том случае, если определен '__STDC_LIB_EXT1__'. Redhat рекомендовал удалить его из будущих спецификаций C. – DavidJ