Contrapartes seguros de itoa ()?

Estoy convirtiendo un progtwig c antiguo a una versión más segura. Las siguientes funciones se usan mucho, ¿podría alguien decirme sus contrapartes seguras? Cualquiera de las funciones de Windows o las funciones de la biblioteca C runtime. Gracias.

itoa() getchar() strcat() memset() 

itoa() es seguro siempre que el búfer de destino sea lo suficientemente grande como para recibir la mayor representación posible (es decir, de INT_MIN con NUL final). Por lo tanto, simplemente puede comprobar el tamaño del búfer. Aún así, no es una función muy buena para usar porque si cambia su tipo de datos a un tipo integral más grande, necesita cambiar a atol , atoll , atoq , etc. Si desea un búfer dynamic que maneje cualquier tipo de atoq con menos problemas de mantenimiento, considere un std::ostringstream (del encabezado ).

getchar() no tiene una “contraparte segura” – para empezar no es inseguro y no tiene potencial de saturación de búfer.

Re memset() : es peligroso porque acepta el criterio de los progtwigdores de que la memoria debe sobrescribirse sin ninguna confirmación del contenido / dirección / longitud, pero cuando se usa correctamente no deja ningún problema, y ​​algunas veces es la mejor herramienta para el trabajo incluso en Progtwigción moderna en C ++. Para verificar los problemas de seguridad con esto, debe inspeccionar el código y asegurarse de que esté orientado a un objeto o búfer adecuado para ser cargado, y que la longitud se calcule correctamente (sugerencia: use sizeof cuando sea posible).

strcat() puede ser peligroso si no se sabe que las cadenas que se concatenan encajan en el búfer de destino. Por ejemplo: char buf[16]; strcpy(buf, "one,"); strcat(buf, "two"); char buf[16]; strcpy(buf, "one,"); strcat(buf, "two"); es totalmente seguro (pero frágil, ya que otras operaciones o cambiar una cadena pueden requerir más de 16 caracteres y el comstackdor no te lo advertirá), mientras que strcat(buf, argv[0]) no lo es. El mejor reemplazo tiende a ser un std :: ostringstream, aunque eso puede requerir una reelaboración significativa del código. Puede escaparse usando strncat() , o incluso, si lo tiene, asprintf("%s%s", first, second) , que asignará la cantidad de memoria necesaria en el montón (recuerde que debe free() ). También podría considerar std :: string y usar operator + para concatenar cadenas.

Ninguna de estas funciones es “insegura” siempre que entienda el comportamiento y las limitaciones. itoa no es estándar C y debe reemplazarse con sprintf("%d",...) si eso le preocupa.

Los demás están bien para el practicante experimentado. Si tiene casos específicos que cree que pueden ser inseguros, debe publicarlos.

Cambiaría itoa (), porque no es estándar, con sprintf o, mejor, snprintf si su objective es la seguridad del código. También cambiaría strcat () con strncat () pero, como también especificaste el lenguaje C ++, una mejor idea sería usar la clase std :: string.

En cuanto a las otras dos funciones, no puedo ver cómo podría hacer que el código sea más seguro sin ver su código.