Pregunta

Cuando intento hacer cosas como esta:

char* prefix = "Sector_Data\\sector";
char* s_num = "0";
std::strcat(prefix, s_num);
std::strcat(prefix, "\\");

y así sucesivamente y así sucesivamente, recibo una advertencia

warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead.

¿Por qué se considera strcat insegura, y hay una manera de deshacerse de esta advertencia sin utilizar strcat_s?

Además, si la única manera de librarse de la advertencia es utilizar strcat_s, ¿cómo funciona (sintaxis-sabia: al parecer no toma dos argumentos)

.
¿Fue útil?

Solución

Debido a que la memoria intermedia, prefijo, podría tener menos espacio que va a copiar en él, provocando un desbordamiento de búfer. Por lo tanto, un hacker podría pasar una serie especialmente diseñado que se sobrescribe la dirección de retorno u otra memoria crítica y comenzar a ejecutar código en el contexto de su programa.

strcat_s resuelve esto te obliga a pasar en la longitud de la memoria intermedia en la que va a copiar la cadena; se truncará la cadena si es necesario para asegurarse de que el buffer no está lleno.

Google strcat_s para ver exactamente cómo usarlo.

Otros consejos

Si está utilizando C ++, por qué no evitar todo el lío y utilizar std::string. El mismo ejemplo sin ningún error sería el siguiente:

std::string prefix = "Sector_Data\\sector";
prefix += "0";
prefix += "\\"

no hay necesidad de preocuparse por el tamaño de búfer y todas esas cosas. Y si usted tiene una API que tiene un const char *, sólo se puede utilizar el miembro .c_str();

some_c_api(prefix.c_str());

Esa es una de las funciones de manipulación de cadenas en C / C ++ que pueden conducir a errores de saturación de búfer.

El problema es que la función no sabe cuál es el tamaño de las memorias intermedias son. A partir de la documentación de MSDN:

  

El primer argumento, strDestination,   debe ser lo suficientemente grande para contener el   strDestination actual y strSource   combinado y un cierre '\ 0';   de lo contrario, puede ocurrir un desbordamiento del búfer.

strcat_s toma un argumento extra diciendo que el tamaño de la memoria intermedia. Esto le permite validar los tamaños antes de hacer el concat, y evitará excesos. Ver http://msdn.microsoft.com/en-us/library/d45bbxx4 .aspx

Usted puede deshacerse de ellos mediante la adición de advertencia:

_CRT_SECURE_NO_WARNINGS

y

_SCL_SECURE_NO_WARNINGS

a las definiciones del preprocesador de su proyecto.

Para activar el aviso de apagado, se puede hacer esto.

#pragma warning(disable:4996)

Por cierto, recomiendo encarecidamente que utilice strcat_s ().

Debido a que no tiene medios de comprobación para ver si la cadena de destino (prefijo) en su caso se escribirá más allá de sus límites. strcat funciona esencialmente haciendo un bucle, copia byte a byte de la cadena de origen en el destino. Sus paradas cuando se ve un valor "0" (simbolizada por '\ 0') llamaron un terminal nulo. Puesto que C no se ha construido en la comprobación de límites, y el str dest es sólo un lugar en la memoria, strcat continuará pasando ad-infinidium incluso si sopla más allá de la fuente str o el mostrador. str no tiene un terminal nulo.

Las soluciones anteriores son específicos de la plataforma a su entorno de ventanas. Si quieres algo independiente de la plataforma, tiene que bregar con strncat:

strncat(char* dest, const char* src, size_t count)

Esta es otra opción cuando se utiliza de forma inteligente. Se puede utilizar la cuenta para especificar el número máximo de caracteres que desea copiar. Para ello, hay que calcular la cantidad de espacio disponible en dest. (Cuánto se asignará - strlen (dest)) y pasar que a medida que el recuento

Hay dos problemas con strcat. En primer lugar, usted tiene que hacer todo su validación fuera de la función, hacer un trabajo que es casi lo mismo que la función:

if(pDest+strlen(pDest)+strlen(pScr) < destSize)

Hay que caminar por toda la longitud de ambas cadenas sólo para asegurarse de que se ajuste, antes de caminar por toda su longitud NUEVO para hacer la copia. Debido a esto, muchos programadores simplemente asumir que va a encajar y pasa la prueba. Lo que es peor, puede ser que cuando el código está escrito primero que se garantiza para caber, pero cuando alguien añade otra strcat, o cambia de un tamaño de búfer o constante en otro lugar en el programa, que ahora tienen problemas.

El otro problema es que si pSrc y PDST solapamiento. Dependiendo de su compilador, strcat puede muy bien ser simple bucle que comprueba un carácter a la vez por un 0 en pSrc. Si PDST sobrescribe que 0, por lo que recibirá en un bucle que se ejecutará hasta que sus errores en el programa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top