一 内存分配
用户在使用内存时,容易犯的错误就是内存泄露。当用户调用内存分配和释放函数时,查找内存泄露比较麻烦。openssl提供了内置的内存分配/释放函数。如果用户完全调用openssl的内存分配和释放函数,可以方便的找到内存泄露点。openssl分配内存时,在其内部维护一个内存分配哈希表,用于存放已经分配但未释放的内存信息。当用户申请内存分配时,在哈希表中添加此项信息,内存释放时删除该信息。当用户通过openssl函数查找内存泄露点时,只需查询该哈希表即可。用户通过openssl回调函数还能处理那些泄露的内存。
openssl供用户调用的内存分配等函数主要在crypto/mem.c中实现,其内置的分配函数在crypto/mem_dbg.c中实现。默认情况下mem.c中的函数调用mem_dbg.c中的实现。如果用户实现了自己的内存分配函数以及查找内存泄露的函数,可以通过调用CRYPTO_set_mem_functions函数和CRYPTO_set_mem_debug_functions函数来设置。下面主要介绍了openssl内置的内存分配和释放函数。
二 内存数据结构
openssl内存分配数据结构是一个内部数据结构,定义在crypto/mem_dbg.c中。如下所示:
typedefstruct app_mem_info_st
{
unsignedlong thread;
constchar*file;
int line;
constchar*info;
struct app_mem_info_st *next;/* tail of thread's stack */
int references;
} APP_INFO;
typedefstruct mem_st
{
void*addr;
int num;
constchar*file;
int line;
unsignedlong thread;
unsignedlong order;
time_t time;
APP_INFO *app_info;
} MEM;
各项意义:
addr:分配内存的地址。
num:分配内存的大小。
file:分配内存的文件。
line:分配内存的行号。
thread:分配内存的线程ID。
order:第几次内存分配。
time:内存分配时间。
app_info:用于存放用户应用信息,为一个链表,里面存放了文件、行号以及线程ID等信息。
references:被引用次数。
三 主要函数
1、CRYPTO_mem_ctrl
本函数主要用于控制内存分配时,是否记录内存信息。如果不记录内存信息,将不能查找内存泄露。
开启内存记录调用CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)。
关闭内存记录调用CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF)。
一旦CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)被调用,直到用户调用CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF)前,用户所有的opessl内存分配都会被记录。
2、CRYPTO_is_mem_check_on
查询内存记录标记是否开启。
3、CRYPTO_dbg_malloc
本函数用于分配内存空间,如果内存记录标记开启,则记录用户申请的内存。当需要记录内存信息时,该函数本身也需要申请内存插入哈希表,为了防止递归申请错误,它申请内存记录信息前必须暂时关闭内存记录标记,申请完毕再放开。
4、CRYPTO_dbg_free
释放内存,如果内存记录标记开启,还需要删除哈希表中对应的记录。
5、CRYPTO_mem_leaks
将内存泄露输出到BIO中。
6、CRYPTO_mem_leaks_fp
将内存泄露输出到FILE中(文件或者标准输出),该函数调用了CRYPTO_mem_leaks。
7、CRYPTO_mem_leaks_cb
处理内存泄露,输入参数为用户自己实现的处理内存泄露的函数地址。该函数只处理一个内存泄露,openssl通过lh_doall_arg调用用户函数来处理所有记录(泄露的内存)。
四 实例
#include<openssl/crypto.h>
#include<openssl/bio.h>
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);/*将内存泄露输出到FILE中*/
OPENSSL_free(p);
BIO_free(b);
return0;
}
运行结果
[root@localhost ~]# cd /openssl-1.1.0c/test
[root@localhost test]# gcc example3.c -o example3 -L/usr/lib -lssl -lcrypto
[root@localhost test]#./example3
[root@localhost test]# cat leak.log
[21:15:32]0 file=example3.c, line=12, thread=140674812970944, number=4, address=01014010
4 bytes leaked in 1 chunks
相关推荐
**5.1 OpenSSL内存分配** - **概念**:OpenSSL内部使用特定的内存分配机制来管理内存。 - **目的**:提高安全性,防止内存泄漏。 **5.2 内存数据结构** - **结构体**:`OPENSSL_malloc`。 - **特性**:追踪内存...
**5.1 OpenSSL内存分配** OpenSSL使用自己的一套内存管理机制,提供了专用的内存分配函数以确保内存的安全使用。 **5.2 内存数据结构** OpenSSL定义了一些内存相关的数据结构,用于跟踪内存使用情况。 **5.3 ...
21 4.1 哈希表 21 4.2 哈希表数据结构 21 4.3 函数说明 22 4.4 编程示例 24 第五章 openssl内存分配 27 5.1 openssl内存分配 27 5.2 内存数据结构 27 5.3 主要函数 28 5.4 编程示例 28...
5.1 openssl内存分配 27 5.2 内存数据结构 27 5.3 主要函数 28 5.4 编程示例 29 第六章 动态模块加载 30 6.1 动态库加载 30 6.2 DSO概述 30 6.3 数据结构 31 6.4 编程示例 32 第七章 抽象IO 34 7.1 openssl抽象IO 34...
21 4.1 哈希表 21 4.2 哈希表数据结构 21 4.3 函数说明 22 4.4 编程示例 24 第五章 openssl内存分配 27 5.1 openssl内存分配 27 5.2 内存数据结构 27 5.3 主要函数 28 5.4 编程示例 28...
**5.1 OpenSSL内存分配** OpenSSL提供了一套内存管理函数,用于更安全地分配和释放内存。 **5.2 内存数据结构** `CRYPTO_MEM`结构体定义了OpenSSL内存管理的相关数据结构。 **5.3 主要函数** - **分配内存**: `...
**5.1 OpenSSL内存分配** - **定义**: OpenSSL提供了一套内存管理机制,用于高效地分配和回收内存资源。 - **优点**: 可以减少内存泄漏的风险。 **5.2 内存数据结构** - **主要结构**: 包括`OPENSSL_malloc`和`...
**5.1 OpenSSL内存分配** - **概念**: OpenSSL内部使用的内存管理机制。 - **优点**: 更加安全,避免内存泄漏等问题。 **5.2 内存数据结构** - **结构**: 通常使用链表来管理已分配的内存块。 **5.3 主要函数** ...
这份手册详细介绍了OpenSSL的使用方法,包括安装、基础概念、堆栈结构、哈希表、内存分配、动态模块加载、抽象IO、配置文件处理、随机数生成、文本数据库、大数处理以及BASE64编解码等。 首先,手册对OpenSSL进行了...
OpenSSL提供了自定义的内存分配机制,以增强程序的稳定性和安全性。通过`OPENSSL_malloc()`、`OPENSSL_free()`等函数,可以更有效地管理内存资源。 ### 动态模块加载 OpenSSL支持动态加载模块,这意味着可以在运行...