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

*** 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。

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

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

C 编程异常 — double free or corruption (fasttop)的更多相关文章

  1. apt-get update失败处理:*** Error in `appstreamcli': double free or corruption (fasttop): 0x00000000015c4bf0 ***

    好像只要卸载一个东西就可以了(至少我的是这样): sudo apt-get purge libappstream3 再重新执行update命令, sudo apt-get update 参考链接: 1 ...

  2. C/C++ 恨透了 double free or corruption

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都 ...

  3. double free or corruption错误

    这是我自己写代码是遇到的错误,完全想不到报错和写错的地方有关联性,记录下来给别人参考. 不允许转载. WhiteBack(&cut_buff,&out_buff,5)函数内有一段 be ...

  4. mycat偶尔会出现JVM报错double free or corruption并崩溃退出

    mycat偶尔会出现JVM报错double free or corruption并崩溃退出 没有复杂的sql,也没有大量的io INFO | jvm | // :: | *** Error in `j ...

  5. 你不知道的JavaScript--Item27 异步编程异常解决方案

    1.JavaScript异步编程的两个核心难点 异步I/O.事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络.文件访问功能,且使之在后端实现了较高的性能.然而异步风格也引来了一 ...

  6. C#中异步编程异常的处理方式

    异步编程异常处理 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.但是对于异步编程来说,异常处理一直 ...

  7. MATLAB与C#混合编程 之 double与MWArray 、MWNumericArray 转化

    double acc_ang_d;//待计算组 MWNumericArray eng_input_array = new MWNumericArray(acc_ang_d); MWArray eng_ ...

  8. 编程异常——假设你报createSQLQuery is not valid without active transaction,...

    非常多时候我们使用hibernate的session时,都是让session在某一执行环境中保持其唯一. 比如在同一线程内用同一个session.在同一方法内用同一session,这样我们就能够用se ...

  9. double free or corruption的原因

    问题描述: 使用hiredisCluster 运行报错,错误截图如下: 通过分析hiredis源代码发现,在net.c的源文件中283行代码: c->tcp.host = strdup(addr ...

  10. ASP.NET Web API编程——异常捕获

    1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息. HttpResponseException包含两个重载的构造函数,其中一个是构造 ...

随机推荐

  1. Jetty的threadpool模块

    Jetty提供的线程池相关的模块,如下: threadpool threadpool-virtual,使用JDK 21提供的virtual threads. threadpool-virtual-pr ...

  2. 首届OpenHarmony竞赛训练营结营颁奖,75所高校学子助力建设开源生态

      由OpenAtom OpenHarmony(以下简称"OpenHarmony")项目群工作委员会和OpenHarmony项目群技术指导委员会主办的首届OpenHarmony竞赛 ...

  3. Agent内存马分析

    什么是Java Agent 我们知道Java是一种强类型语言,在运行之前必须将其编译成.class字节码,然后再交给JVM处理运行.Java Agent就是一种能在不影响正常编译的前提下,修改Java ...

  4. openGauss资源池化开发者入门指南(二)

    openGauss 资源池化开发者入门指南(二) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存 ...

  5. Tomcat启动闪退的10个解决小技巧

    引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的. 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事. 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项 ...

  6. CentOS 5.5编译安装vsftpd-2.3.4配置虚拟用户

    CentOS 5.5编译安装vsftpd-2.3.4配置虚拟用户 2012-02-22 17:18:15|  分类: rhel_vsftp|举报|字号 订阅 centos 5.5编译安装vsftpd- ...

  7. 报表的 SQL 注入风险是什么意思?如何防范?

    啥是 SQL 注入风险? 数据库要执行 SQL 访问数据,数据库是个执行机构,它只会检查传来的 SQL 是不是合乎语法,而并不会关心这个语句是否会造成伤害(数据泄露或破坏).正因为只要符合语法规则就会 ...

  8. k8s 深入篇———— k8s 的本质[四]

    前言 简单整理一下k8s的本质. 正文 首先,Kubernetes 项目要解决的问题是什么? 编排?调度?容器云?还是集群管理? 实际上,这个问题到目前为止都没有固定的答案.因为在不同的发展阶段,Ku ...

  9. pid算法函数实现,c语言版

    #include <stdio.h> float pid(float setpoint, float process_variable, float kp, float ki, float ...

  10. 鸿蒙HarmonyOS实战-ArkUI动画(弹簧曲线动画)

    前言 弹簧曲线动画是一种模拟弹簧运动的动画效果,通过改变弹簧的拉伸或压缩来表现不同的运动状态.以下是制作弹簧曲线动画的步骤: 创建一个弹簧的模型,可以使用圆形或者曲线来代表弹簧的形状. 将弹簧固定在一 ...