Como algunos de ustedes deben saber, Microsoft banned memcpy()
from their Security Development Lifecycle, reemplazándolo con memcpy_s()
.Microsoft SDL y memcpy deprecation
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);
Así que si su código solía ser:
if (in_len > dst_len) {
/* error */
}
memcpy(dst, src, in_len);
se convierte en:
if (memcpy_s(dst, dst_len, src, src_len)) {
/* error */
}
O, con truncamiento,
memcpy(dst, src, min(in_len, dst_len));
vs
(void)memcpy_s(dst, dst_len, src, src_len);
La pregunta: ¿cómo un parámetro de longitud adicional hace que el código sea más seguro? Para usar memcpy()
, ya debería tener los cuatro parámetros conocidos y pasar la longitud apropiada como tercer argumento. ¿Qué me impide cometer el mismo error al calcular mal el tamaño del búfer de destino y pasar el valo equivocado de dst_size
? No veo por qué es diferente de memcpy()
y por qué está en desuso. ¿Hay algún caso de uso común que no pueda ver? ¿Qué me falta aquí?
Tenga en cuenta que memcpy_s() es parte de C11 Anexo K, que sólo es una * opcional * parte de C11 la especificación. Varios implementadores de compiladores han rechazado el Anexo K y nunca lo implementarán. Por lo tanto, solo úselo si '__STDC_LIB_EXT1__' está definido. Redhat ha recomendado que se elimine de futuras especificaciones C. – DavidJ