Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo utilizar la función remalloc() y a qué debes prestar atención?

¿Cómo utilizar la función remalloc() y a qué debes prestar atención?

Capítulo 5 Asignación de memoria

5.1 Asignación de memoria de openssl

Cuando los usuarios usan memoria, un error común son las pérdidas de memoria. Cuando los usuarios llaman a las funciones de asignación y liberación de memoria, es problemático encontrar pérdidas de memoria. openssl proporciona funciones integradas de asignación/liberación de memoria. Si el usuario llama completamente a las funciones de asignación y liberación de memoria de openssl, el punto de pérdida de memoria se puede encontrar fácilmente. Cuando openssl asigna memoria, mantiene internamente una tabla hash de asignación de memoria para almacenar información de la memoria que ha sido asignada pero no liberada. Cuando el usuario solicita la asignación de memoria, esta información se agrega a la tabla hash y se elimina cuando se libera la memoria. Cuando los usuarios encuentran puntos de pérdida de memoria a través de la función openssl, solo necesitan consultar la tabla hash. Los usuarios también pueden manejar la memoria perdida a través de la función de devolución de llamada de openssl.

La asignación de memoria de Openssl y otras funciones para que los usuarios las llamen se implementan principalmente en crypto/mem.c, y su función de asignación incorporada se implementa en crypto/mem_dbg.c. De forma predeterminada, las funciones en mem.c llaman a la implementación en mem_dbg.c. Si el usuario implementa su propia función de asignación de memoria y función para encontrar pérdidas de memoria, puede configurarla llamando a la función CRYPTO_set_mem_functions y a la función CRYPTO_set_mem_debug_functions. A continuación se presentan principalmente las funciones de asignación y liberación de memoria integradas de openssl.

5.2 Estructura de datos de la memoria

La estructura de datos de asignación de memoria de Openssl es una estructura de datos interna definida en crypto/mem_dbg.c. Como se muestra a continuación:

typedef struct app_mem_info_st

{

hilo largo sin firmar

const char *file; p> int line;

const char *info;

struct app_mem_info_st *next /* cola de la pila del hilo */

int references; >

} APP_INFO;

typedef struct mem_st

{

void *addr;

int num;

const char *file;

int line;

hilo largo sin firmar

orden larga sin firmar

time_t;

APP_INFO *app_info;

} MEM;

Significado:

addr: la dirección de la memoria asignada.

num: el tamaño de la memoria asignada.

archivo: archivo para asignar memoria.

Línea: El número de línea donde se asigna la memoria.

hilo: el ID del hilo que asigna memoria.

Orden: Cuántas veces se asigna la memoria.

time: tiempo de asignación de memoria.

app_info: se utiliza para almacenar información de la aplicación del usuario. Es una lista vinculada que almacena información como archivos, números de línea e ID de subprocesos.

referencias: número de veces que ha sido citado.

5.3 Funciones principales

1) CRYPTO_mem_ctrl

Esta función se utiliza principalmente para controlar si se registra información de la memoria cuando se asigna la memoria. Si no se registra la información de la memoria, no se pueden encontrar pérdidas de memoria. Para activar el registro de memoria, llame a CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON), ​​​​y para desactivar el registro de memoria, llame a CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF). Una vez que se llama a CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON), ​​todas las asignaciones de memoria operativa del usuario se registrarán hasta que el usuario llame a CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF).

2) CRYPTO_is_mem_check_on

Consulta si la marca de registro de memoria está activada.

3) CRYPTO_dbg_malloc

Esta función se utiliza para asignar espacio de memoria. Si el indicador de registro de memoria está activado, se registra la memoria solicitada por el usuario. Cuando es necesario registrar información de la memoria, la función en sí también debe solicitar que la memoria se inserte en la tabla hash. Para evitar errores de aplicación recursivos, debe cerrar temporalmente la marca de registro de la memoria antes de solicitar la información de grabación de la memoria y luego liberarla. después de completar la solicitud.

4) CRYPTO_dbg_free

Liberar memoria Si la marca de registro de memoria está activada, es necesario eliminar el registro correspondiente en la tabla hash.

5) CRYPTO_mem_leaks

Pérdidas de memoria de salida en BIO.

6) CRYPTO_mem_leaks_fp

Pérdidas de memoria de salida a ARCHIVO (archivo o salida estándar), esta función llama a CRYPTO_mem_leaks.

7) CRYPTO_mem_leaks_cb

Maneja pérdidas de memoria El parámetro de entrada es la dirección de la función implementada por el usuario para manejar pérdidas de memoria. Esta función solo necesita manejar una pérdida de memoria, openssl llama a la función de usuario a través de lh_doall_arg para manejar todos los registros (memoria perdida).

5.4 Ejemplo de programación

1) Ejemplo 1

#include lt; string.hgt

#include openssl/crypto; .hgt;

int principal()

{

char *p

int

p=OPENSSL_malloc(4);

p=OPENSSL_remalloc(p, 40);

p=OPENSSL_realloc(p, 32); 0; ilt; 32; i )

memset(amp; p[i], i, 1);

/* Borrar (codificar) el área de memoria anterior durante la reasignación */

p=OPENSSL_realloc_clean(p, 32, 77);

p=OPENSSL_remalloc(p, 40);

OPENSSL_malloc_locked(3);

p>

OPENSSL_free(p);

return 0;

}

El ejemplo anterior utiliza funciones básicas de asignación y liberación de memoria de openssl.

OPENSSL_malloc: Asignar espacio de memoria.

OPENSSL_remalloc: Reasignar espacio de memoria.

OPENSSL_realloc_clean: reasigna el espacio de memoria, copia los datos antiguos, codifica el espacio de datos antiguo y libéralo.

OPENSSL_malloc_locked está relacionado con cerraduras.

OPENSSL_free: Libera espacio.

2) Ejemplo 2

include lt; openssl/crypto.hgt

#include lt/bio.hgt; > int main()

{

char *p;

BIO *b

CRYPTO_malloc_debug_init();

CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);

CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);

p=OPENSSL_malloc(4);

CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF);

b=BIO_new_file("leak.log", "w");

CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);

CRYPTO_mem_leaks(b); (p);

BIO_free(b);

devuelve 0;