【代码安全审计】CJSON库内存泄漏检查
CJSON库使用指南摘要:CJSON是处理JSON数据的轻量级C语言库,提供序列化和反序列化功能。它使用动态内存管理,开发者需手动释放内存。主要释放函数为cJSON_Delete(用于递归释放JSON对象树)和cJSON_free(用于释放字符串)。创建型函数(如cJSON_CreateObject)生成的对象需用cJSON_Delete释放,而打印函数(如cJSON_Print)返回的字符串需用
·
1 CJSON介绍
-
CJSON 库下载网址:https://sourceforge.net/projects/cjson/

-
工作中 CJSON 常用于处理 JSON 数据的序列化(生成 JSON 字符串)和反序列化(解析 JSON 字符串)。
-
CJSON 库使用动态内存分配(如 malloc/free)管理 JSON 对象,因此必须手动释放 CJSON 库分配的内存。
-
CJSON 库提供了两个释放内存的函数:
cJSON_Delete(cJSON *item);
cJSON_free(void *object)
cJSON_Delete 是用来释放json对象的,cJSON_free是用来释放其他对象的,两者不能混用。cJSON_Delete 接口会递归释放一个 json 体内的所有对象,而 cJSON_free 只会进行一次释放。
2 使用场景
当使用下面这些创建 JSON 对象时,需要用cJSON_Delete()释放,(当然,释放父 JSON 对象后,子 JSON 对象也会被释放)。
cJSON *cJSON_CreateNull(void);
cJSON *cJSON_CreateTrue(void);
cJSON *cJSON_CreateFalse(void);
cJSON *cJSON_CreateBool(int b);
cJSON *cJSON_CreateNumber(double num);
cJSON *cJSON_CreateString(const char *string);
cJSON *cJSON_CreateArray(void);
cJSON *cJSON_CreateObject(void);
示例如下:
cJSON *ptr = cJSON_CreateObject();
cJSON_Delete(ptr);
释放 CJSON 库分配的字符串,必须对每个通过 cJSON_Print() 返回的字符串调用一次,示例如下:
// cJSON_Print() 处理同 cJSON_PrintUnformatted
char* str = cJSON_PrintUnformatted(cJSON);
cJSON_free(str);
3 函数对比
| 函数 | 作用对象 | 释放逻辑 |
|---|---|---|
cJSON_Delete |
cJSON* 对象(结构体指针) |
递归释放整个 JSON 对象树(包括所有子节点和动态分配的成员), 调用 free() 释放结构体本身。 |
cJSON_free |
字符串指针(char*) |
直接调用系统 free() 释放内存,通常用于释放 cJSON_Print() 返回的字符串。 |
4 总结
| 接口 | 功能 | 输出 | 释放方法 |
|---|---|---|---|
| cJSON_CreateObject | 生成一个空白的 json 对象 | 一个 json 对象 | cJSON_Delete |
| cJSON_Parse | 将 json 字符串解析成 json 对象 | 一个 json 对象 | cJSON_Delete |
| cJSON_ParseWithLength | 将固定长度 json 字符串解析成 json 对象 | 一个 json 对象 | cJSON_Delete |
| cJSON_Duplicate | 复制一个 json 对象 | 一个 json 对象 | cJSON_Delete |
| cJSON_Print | 将 json 对象解析成格式化的 json 字符串 | 一个 json 字符串 | cJSON_free |
| cJSON_PrintUnformatted | 将 json 对象解析成无格式化的 json 字符串 | 一个 json 字符串 | cJSON_free |
| cJSON_PrintPreallocated | 将 json 对象解析成 json 字符串 | 一个 json 字符串 | cJSON_free |
本文是「C/C++ 代码安全审计」系列的第 1 篇,点击专栏导航查看全部系列内容。
更多推荐
所有评论(0)