C 编程异常 — double free or corruption (fasttop)

news/2024/12/23 4:09:10/

问题:运行代码的时候程序崩溃。

*** Error in `./parsing': double free or corruption (fasttop): 0x00000000023d2350 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81679)[0x7f349ead0679]
./parsing[0x4011fe]
./parsing[0x401b07]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f349ea71505]
./parsing[0x400f59]
======= Memory map: ========
00400000-00413000 r-xp 00000000 08:01 34603142                           /root/Lispy/parsing
00612000-00613000 r--p 00012000 08:01 34603142                           /root/Lispy/parsing
00613000-00614000 rw-p 00013000 08:01 34603142                           /root/Lispy/parsing
023a4000-023df000 rw-p 00000000 00:00 0                                  [heap]
7f3494000000-7f3494021000 rw-p 00000000 00:00 0
7f3494021000-7f3498000000 ---p 00000000 00:00 0
7f34980e5000-7f34980fa000 r-xp 00000000 08:01 2709898                    /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f34980fa000-7f34982f9000 ---p 00015000 08:01 2709898                    /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f34982f9000-7f34982fa000 r--p 00014000 08:01 2709898                    /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f34982fa000-7f34982fb000 rw-p 00015000 08:01 2709898                    /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f34982fb000-7f349e825000 r--p 00000000 08:01 2129632                    /usr/lib/locale/locale-archive
7f349e825000-7f349e84a000 r-xp 00000000 08:01 2137260                    /usr/lib64/libtinfo.so.5.9
7f349e84a000-7f349ea4a000 ---p 00025000 08:01 2137260                    /usr/lib64/libtinfo.so.5.9
7f349ea4a000-7f349ea4e000 r--p 00025000 08:01 2137260                    /usr/lib64/libtinfo.so.5.9
7f349ea4e000-7f349ea4f000 rw-p 00029000 08:01 2137260                    /usr/lib64/libtinfo.so.5.9
7f349ea4f000-7f349ec12000 r-xp 00000000 08:01 2129638                    /usr/lib64/libc-2.17.so
7f349ec12000-7f349ee12000 ---p 001c3000 08:01 2129638                    /usr/lib64/libc-2.17.so
7f349ee12000-7f349ee16000 r--p 001c3000 08:01 2129638                    /usr/lib64/libc-2.17.so
7f349ee16000-7f349ee18000 rw-p 001c7000 08:01 2129638                    /usr/lib64/libc-2.17.so
7f349ee18000-7f349ee1d000 rw-p 00000000 00:00 0
7f349ee1d000-7f349ef1e000 r-xp 00000000 08:01 2129646                    /usr/lib64/libm-2.17.so
7f349ef1e000-7f349f11d000 ---p 00101000 08:01 2129646                    /usr/lib64/libm-2.17.so
7f349f11d000-7f349f11e000 r--p 00100000 08:01 2129646                    /usr/lib64/libm-2.17.so
7f349f11e000-7f349f11f000 rw-p 00101000 08:01 2129646                    /usr/lib64/libm-2.17.so
7f349f11f000-7f349f15b000 r-xp 00000000 08:01 2137399                    /usr/lib64/libreadline.so.6.2
7f349f15b000-7f349f35b000 ---p 0003c000 08:01 2137399                    /usr/lib64/libreadline.so.6.2
7f349f35b000-7f349f35d000 r--p 0003c000 08:01 2137399                    /usr/lib64/libreadline.so.6.2
7f349f35d000-7f349f363000 rw-p 0003e000 08:01 2137399                    /usr/lib64/libreadline.so.6.2
7f349f363000-7f349f365000 rw-p 00000000 00:00 0
7f349f365000-7f349f387000 r-xp 00000000 08:01 2136893                    /usr/lib64/ld-2.17.so
7f349f574000-7f349f57b000 r--s 00000000 08:01 2137112                    /usr/lib64/gconv/gconv-modules.cache
7f349f57b000-7f349f57f000 rw-p 00000000 00:00 0
7f349f583000-7f349f586000 rw-p 00000000 00:00 0
7f349f586000-7f349f587000 r--p 00021000 08:01 2136893                    /usr/lib64/ld-2.17.so
7f349f587000-7f349f588000 rw-p 00022000 08:01 2136893                    /usr/lib64/ld-2.17.so
7f349f588000-7f349f589000 rw-p 00000000 00:00 0
7ffed1ac3000-7ffed1ae4000 rw-p 00000000 00:00 0                          [stack]
7ffed1af3000-7ffed1af5000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
已放弃

分析

typedef struct lval {int type;long num;/* Count and Pointer to a list of "lval*" */struct lval** cell;int count;/* Error and Symbol types have some string data */char *err;char *sym;
} lval;lval *lval_sym(char *sym) {lval *v = malloc(sizeof(lval));v->type = LVAL_SYM;v->sym = malloc(strlen(sym) + 1);strcpy(v->sym, sym);return v;
}void lval_del(lval *v) {switch (v->type) {/* Do nothing special for number type */case LVAL_NUM:break;/* For Err or Sym free the string data */case LVAL_ERR:free(v->err);break;case LVAL_SYM:free(v->sym);break;/* If Sexpr then delete all elements inside */case LVAL_SEXPR:for (int i = 0; i < v->count; i++) {lval_del(v->cell[i]);}/* Also free the memory allocated to contain the pointers */free(v->cell);break;}/* Free the memory allocated for the "lval" struct itself */free(v);
}

因为上述代码中,结构体变量 lval *lval_sym 中的成员 sym 没有被释放 free(v->sym);,就直接释放了变量自身 free(v)。之所以不进入 switch 条件判断,是因为 v->type 成员的值出现了 Bug。

所以本质的原因还是因为结构体的成员空间还没有被释放就直接释放了结构体变量本身导致的

解决:在释放结构体变量自身的内存空间之前,需要首先将结构体成员指向的内存空间释放掉。


http://www.ppmy.cn/news/237566.html

相关文章

微信小程序开发—(一)全局配置

一.app.json 使用app.json文件来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等. 注意在.json不能注释&#xff0c;否则会出错。 二.工具栏tabBar 如果我们的小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部…

LeetCode_二叉树_BFS_中等_117.填充每个节点的下一个右侧节点指针 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 …

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作&#xff0c;需要调用sqrt&#xff0c;exp&#xff0c;abs等函数&#xff0c;那么时候你有没有想过&#xff1a;这个些函数系统是如何实现的&#xff1f;就拿最常用的sqrt函数来说吧&#xff0c;系统怎么来实现这个经常调用的函数呢&#xf…

COM 类工厂中 CLSID 为 {A86BB4D8-209D-40E1-87A6-7AA236094FAD} 的组件时失败,原因是出现以下错误: 800401...

第一&#xff1a; 检查dll文件是否存在 第二&#xff1a; 兼容问题&#xff0c;看iis配置是否兼容32位应用程序。如果你原先用32位开发系统时。 64位Win7下&#xff0c;IIS7的进程池l默认都没有 开启32位应用程序&#xff0c;这样会导致运行一个莫名其妙的错误&#xff1a; 未…

centos6.5 ambari2.4.1.0安装Demo:

centos6.5 && ambari2.4.1.0安装Demo&#xff1a; 我的机器是本地搭的虚拟机&#xff08;3台&#xff09;&#xff0c;由于电脑配置限制&#xff08;8g&#xff09;&#xff0c;只能分给直节点2g&#xff0c;两从节点各1.5g&#xff1b; 原文链接&#xff1a;http://b…

漏洞复现 a.WSO2 文件上传 (CVE-2022-29464)

附件二&#xff1a;漏洞详情提交文件模板 1.漏洞描述 CVE-2022-29464 是 Orange Tsai发现的 WSO2 上的严重漏洞。该漏洞是⼀种未经身份验证的⽆ 限制任意⽂件上传&#xff0c;允许未经身份验证的攻击者通过上传恶意 JSP ⽂件在 WSO2 服务器上获得RCE。 2.漏洞影响 这会影响到&a…

利用window的CLSID可以干的一些事情

利用window的CLSID可以干的一些事情&#xff08;关于CLSID的官方介绍&#xff09; 一、隐藏文件 重命名文件为&#xff1a;回收站.{645FF040-5081-101B-9F08-00AA002F954E} 文件夹就会变为回收站&#xff0c;里面的文件也会隐藏起来。 恢复&#xff1a;在cmd中执行&#xff…

排列组合的写法_排列组合A几几的 C几几的怎么算

展开全部 A是排列62616964757a686964616fe78988e69d8331333365666231&#xff0c;C是组合 。 A(3&#xff0c;2)32&#xff0c; 写的时候等号左边3是下标&#xff0c;2是上标&#xff0c;等号右边从下标3开始&#xff0c;连续乘上标2个数字&#xff0c;每个数字都比前面小1。 C…