2012-08-01 12 views
14

Recientemente he empezado a estudiar sobre fugas de memoria en C++, por lo que puedo hacer preguntas ingenuas.
Tengo una biblioteca de C++ que está utilizando OpenSSL - mi tarea es comprobar si hay pérdidas de memoria en esta lib. He ejecutado el Visual Leak Detector para verificar fugas de mem.
veo que las llamadas a SSL_library_init(); y SSL_load_error_strings(); están llevando fugas - google rápida está demostrando que al final del uso Tengo que llamar a los siguientes:OpenSSL :: SSL_library_init() pérdida de memoria

CONF_modules_free(); 
ERR_remove_state(0); 
ENGINE_cleanup(); 
CONF_modules_unload(1); 
ERR_free_strings(); 
EVP_cleanup(); 
CRYPTO_cleanup_all_ex_data(); 

La fuga de hecho disminuyó, pero aún hay dos fugas (que la herramienta VLD me muestra) que sucede porque la llamada SSL_library_init.
¿Alguien sabe qué más tengo que hacer para liberar todas las fugas de mem?

+0

No recomendaría EVP_cleanup() y CRYPTO_cleanup_all_ex_data(). Si hay múltiples bibliotecas usadas en la aplicación, digamos libssh2, no sabemos cuándo se llamará, y esto descargará todas las tablas y limpiará todos los datos globales. Tomando esta pregunta en consideración una de las librerías de código abierto abiertas, Pegasus implementó esto, y esto está causando bloqueos en nuestra aplicación. Esta biblioteca abierta de pegasus está limpiando toda la tabla y los datos globales de openssl una vez que se hace su uso. Otras bibliotecas en otros hilos están fallando justo en el medio debido a la limpieza. – Srikan

+0

Usarlo en el lugar correcto es importante – Srikan

+1

Relacionado, también consulte [Cómo desinicializar correctamente OpenSSL] (http://stackoverflow.com/q/29845527). – jww

Respuesta

5

Como entiendo, toda la memoria asignada durante SSL_library_init() y SSL_load_error_strings() se almacena en variables globales, por lo que entra en la categoría de "Memoria en uso" más bien en la categoría de pérdida de memoria ya que la memoria aún está accesible cuando programa está muriendo.

Una sugerencia es que se llame a ERR_remove_state(0) en cada hilo donde se usa SSL, porque cuando se llama al ERR_remove_state con el argumento 0, simplemente borra el estado de error para el hilo actual. Otras llamadas me parecen buenas. Si pudiera publicar, "dos filtraciones" que VLD sigue mostrando, puedo verificar.

+1

Primero, ¡gracias! Además, si publico las dos filtraciones, ¿qué desea ver? la fuga proviene de SSL_library_init(), porque cuando hago un comentario sobre esta llamada, VLD no informa ninguna fuga. Tengo otras dos preguntas: 1. ¿me puede remitir a cualquier sitio web para que pueda obtener más información sobre las fugas de memoria frente a la "memoria en uso"? 2. De alguna forma, el VLD a veces no me muestra la pila de llamadas para ver si hay fugas porque la función OpenSSL funciona, ¿sabes por qué? Estoy usando OpenSSl como lib estática compilada en mi biblioteca. – RRR

+1

Si publica la pila de llamadas, puedo ayudar a verificar si hay alguna otra API gratis en OpenSSL para llamar. Para 1: lo siento. No estoy al tanto de ningún sitio web. Pero, el punto es que, hasta que salga de su punto de aplicación, si necesita una memoria, entonces es un caso de Memoria en uso. El otro caso es que no necesita la memoria, pero todavía tiene punteros con los que puede acceder a la memoria, por lo tanto, la memoria no se pierde y aún puede liberarla. Para 2: es posible que OpenSSL no se haya compilado en el modo de depuración debido a que VLD no puede extraer suficiente información que pueda mostrarse. – Jay

+0

Nota adicional: Obtuve la terminología de "Memoria en uso" de la herramienta IBM Rational Purify, que generalmente uso para probar pérdidas de memoria en Windows. – Jay

6

para deshacerse de los dos bloques de memoria finales asignados en SSL_library_init() intento:

sk_free(SSL_COMP_get_compression_methods()); 
6

para deshacerse de error de compilación en la respuesta de Joe H:

sk_SSL_COMP_free(SSL_COMP_get_compression_methods()); 
+0

que causará un error de memoria cuando la inicialización de openssl y la desinicialización se realiza en un bucle –

+0

Esto debería ser un comentario. –

2

llamada SSL_COMP_free_compression_methods();.

+0

¿Estás seguro de que este comando existe? ¿Y se supone que debe hacer algo diferente de la respuesta de 4LegsDrivenCat? – Alex

+1

@Alex, por supuesto que existe, https://github.com/openssl/openssl/blob/master/ssl/ssl_ciph.c#L1909 y es la forma correcta (en la medida en que la palabra "correcto" se puede aplicar a OpenSSL) para liberar la lista de métodos de compresión. Liberar el puntero manualmente dejará claramente un puntero colgando en alguna parte. – avakar

+0

Ok, tienes razón. ¿Qué encabezado necesito incluir para acceder a esta función? Incluí todos los encabezados que figuran en el archivo que me mostró y ssl_locl.h no estaba allí (y los otros no lo tenían). Instalé la versión más reciente de OpenSSL de Shining Light Productions, es decir [1.0.2a] (http://slproweb.com/products/Win32OpenSSL.html) – Alex