El siguiente código provoca un error y mata mi aplicación. Tiene sentido ya que el búfer tiene solo 10 bytes de longitud y el texto tiene 22 bytes de longitud (desbordamiento de búfer).sprintf_s con un búfer demasiado pequeño
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
¿Cómo puedo detectar este error para poder informarlo en lugar de bloquear mi aplicación?
Editar:
Después de leer los comentarios a continuación Fui con _snprintf_s. Si devuelve un valor -1, entonces el búfer no se actualizó.
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
Pasar el tamaño del búfer y el tamaño del búfer menos uno es obtuso y propenso a errores. Debería preferir la variante que describo a continuación: length = _snprintf_s (buffer, _TRUNCATE, "1234567890.1234567890."); Dado que se omite el primer parámetro de tamaño, el compilador usa la sobrecarga de la plantilla que infiere el tamaño. _TRUNCATE es un valor especial que hace lo que dice. No hay números mágicos, y ahora su código es seguro, sostenible y un buen ejemplo. Si te gusta este comentario y _snprintf_s, entonces debes seleccionar mi respuesta, en lugar de la peligrosa respuesta snprintf/_snprintf. –