c linux tr24731

sprintf_s no fue declarado en este alcance



linux tr24731 (6)

Durante una transferencia de mi programa de Windows a Linux, escribí la siguiente implementación en mi propio windows.h:

inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...) { va_list ap; va_start(ap, format); int result = vsnprintf(buffer, sizeOfBuffer, format, ap); va_end(ap); return result; } template<size_t sizeOfBuffer> inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...) { va_list ap; va_start(ap, format); int result = vsnprintf(buffer, sizeOfBuffer, format, ap); va_end(ap); return result; }

Tengo un programa de C que utiliza sprintf_s . Funciona bien en Windows, pero cuando compilo mi código en Linux da este error:

sprintf_s was not declared in this scope.

¿Por qué sucede esto y cómo puedo solucionarlo?


No es estándar, no encontrarás tal función en Linux.

La función estándar snprintf debería tener una semántica similar.


snprintf es inseguro, solo sprintf_s es seguro. snprintf no garantiza agregar un / 0 final, lo que lleva a posibles desbordamientos posteriores. mire https://github.com/rurban/safeclib para una implementación adecuada.


sprintf_s no forma parte de la biblioteca estándar de C, por lo que no es portátil, por lo que no puede usarlo en Linux. PERO tienes snprintf, que es muy similar y debería ayudarte a lograr lo que quieres.


sprintf_s es solo una parte del Anexo K, un Anexo opcional a la norma C11:

Anexo k

...

Alcance K.2

  1. Este anexo especifica una serie de extensiones opcionales que pueden ser útiles para mitigar las vulnerabilidades de seguridad en los programas, y comprenden nuevas funciones, macros y tipos declarados o definidos en los encabezados estándar existentes.

...

K.3.5.3.6 La función sprintf_s

Sinopsis

#define __STDC_WANT_LIB_EXT1__1 #include <stdio.h> int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);

(énfasis añadido)

Nunca llegó a POSIX (o Linux) (y no se lo pierde en absoluto, incluso hay argumentos sobre su utilidad en el comité).

Para una mejor portabilidad, use snprintf que es parte del estándar básico y proporciona toda la funcionalidad que necesitará.


sprintf_s no es parte de la biblioteca estándar de C, y no podrás usarlo en Linux.

Sin embargo, snprintf es estándar y debe hacer la misma tarea.