Ninguna producción malloc()
implementación debe evitar que intente escribir más allá de lo que asignó. Se supone que si asigna 123 bytes, usará todo o menos de lo que asignó. malloc()
, por razones de eficiencia, tiene que asumir que un programador va a hacer un seguimiento de sus punteros.
El uso de una memoria que no le solicitó explícita y exitosamente malloc()
para darle un comportamiento indefinido. Puede haber pedido n bytes pero obtuvo n + x, debido a la optimización de la implementación malloc()
para la alineación de bytes. O podrías estar escribiendo en un agujero negro. Nunca se puede saber, es por eso que es un comportamiento indefinido.
Dicho esto ...
Hay malloc()
implementaciones que le dan construida en statistics and debugging, sin embargo, estos deben ser utilizados en lugar de la instalación estándar malloc()
igual que lo haría si estuviera usando un garbage collected variety.
También he visto variantes diseñadas estrictamente para LD_PRELOAD que exponen una función que le permite definir una devolución de llamada con al menos un puntero de vacío como argumento. Ese argumento espera una estructura que contiene los datos estadísticos. Otras herramientas como electric fence simplemente detendrán su programa en la instrucción exacta que dio como resultado un desbordamiento o acceso a bloques no válidos. Como @R .. señala en los comentarios, eso es genial para la depuración pero terriblemente ineficiente.
En honor a la verdad o (como dicen) 'al final del día' - es mucho más fácil de usar un perfilador montón como Valgrind y sus herramientas asociadas (massif) en este caso, lo que le dará un poco de información. En este caso particular, Valgrind habría señalado lo obvio: usted escribió más allá del límite asignado. En la mayoría de los casos, sin embargo, cuando esto no es intencional, un buen detector de perfil/error no tiene precio.
El uso de un generador de perfiles no siempre es posible debido a:
- problemas de tiempo mientras se ejecuta bajo un perfilador (pero los que son comunes en cualquier momento llama a
malloc()
son interceptados).
- Profiler no está disponible para su plataforma/arco
- Los datos de depuración (de una tala
malloc()
) debe ser una parte integral del programa
Se utilizó una variante de la biblioteca que he vinculado en HelenOS (No estoy seguro de si todavía lo están usando) durante bastante tiempo, ya que se sabía que la depuración en el VMM causaba locura.
Aún así, piense bien acerca de futuras ramificaciones cuando considere una caída en el reemplazo, cuando se trata de la instalación malloc()
, casi siempre desea usar lo que el sistema envía.
tuvo la suerte de no anular ningún fragmento importante de la memoria por los 4 bytes adicionales que no le pertenecen; no serás tan afortunado cada vez, y eso provocará un colapso. – holex