6

Anteriormente encontré un problema con la memoria dinámica en C (visual studio). Tenía un programa más o menos funcional que arrojaba un error en tiempo de ejecución al liberar uno de los almacenamientos intermedios. Era una clara corrupción de memoria, el programa escribió sobre el final del búfer.Corrupción de la memoria de depuración

Mi problema es que me llevó mucho tiempo rastrear. El error se redujo después de la corrupción, y tuve que depurar manualmente toda la ejecución para encontrar cuándo se sobrescribe el búfer.

¿Hay alguna herramienta para ayudar a rastrear este problema? si el programa se habría estrellado de inmediato que habría encontrado el problema mucho más rápido ...

un ejemplo de la cuestión:

int *pNum = malloc(10 * sizeof(int)); 

//     || 
//     \/  
for(int i = 0; i < 13; i++) 
{ 
pNum[i] = 3; 
} 

// error.... 
free(pNum); 
+0

no es este tipo de lo que la opción del compilador 'Buffer Secutity Check' sin VS hace? – stijn

+4

¿No usa números mágicos? – phant0m

+5

@ phant0m no era un código real, era un ejemplo, ni era mi código ... el búfer se asignó dinámicamente en función del tamaño de los datos, y la función que calcula su tamaño tenía un pequeño error ... además de mi pregunta es acerca de cómo rastrear el problema, no prevenirlo ... –

Respuesta

3

utilizo pageheap. Esta es una herramienta de Microsoft que cambia la forma en que funciona el asignador. Con pageheap activado, cuando llama a malloc, la asignación se redondea a la página más cercana (un bloque de memoria) y luego se coloca una página adicional de memoria virtual configurada para no leer/no escribir. La memoria dinámica que asigna está alineada de modo que el final de su búfer esté justo antes del final de la página antes de la página virtual. De esta forma, si pasa el borde de su búfer, a menudo por un solo byte, el depurador puede atraparlo fácilmente.

2

¿Hay alguna herramienta \ manera de ayudar en la búsqueda de este ¿problema?

Sí, ese es precisamente el tipo de error que los analizadores de códigos estáticos intentan localizar. p.ej. splint/PC-Lint

He aquí una lista de este tipo de herramientas: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

Editar: en probar férula en el fragmento de código me sale el siguiente aviso:

main.c: 9: 2: Tienda posible fuera de límites: pnum [i]

Presumiblemente, esta advertencia le habría ayudado.

3

Uso "puntos de interrupción de datos" para eso. En su caso, cuando el programa se bloquea, puede ser que primero se quejan de esta manera: el bloque

Montón a 00.397.848 modificación realizada el pasado 0039789C solicitó tamaño de 4c

A continuación, inicie de nuevo el programa, y ​​establecer una Punto de interrupción de datos en la dirección 0039789C. Cuando el código escribe en esa dirección, la ejecución se detendrá. A menudo sucede que encuentro el error inmediatamente en este punto.

Si el programa asigna y desasigna la memoria en varias ocasiones, y que pasa a ser en esta dirección exacta, basta desactivar cancelaciones de asignación:

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_DELAY_FREE_MEM_DF); 
0

Nuestra herramienta CheckPointer puede ayudar a encontrar errores de administración de memoria. Funciona con GCC 3/4 y dialectos de Microsoft de C.

Muchas comprobaciones dinámicas solo capturan los accesos fuera de de un objeto, y solo si el objeto está asignado en el montón. CheckPointer encontrará errores de acceso a memoria dentro de un objeto asignado en el montón; es ilegal acceder al final de un campo en una estructura, independientemente del tipo de campo; la mayoría de los inspectores dinámicos no pueden detectar tales errores. También encontrará accesos fuera del borde de los lugareños.

Cuestiones relacionadas