C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***

摘要:
…LZ今天在编写Socket程序时使用malloc动态分配堆上结构的空间,并在使用空闲函数释放空间时报告了一个错误,例如invalidnextsize。经过两个小时的调试,发现这是由于不小心越界造成的。此外,对于上述栗子,使用strcpy而不是strncpy不会报告错误。但是,一旦要复制的字符超过8个字节,仍可能导致错误。因此,在使用内存时一定要注意长度,千万不要超过限制。

.

.

.

.

.

LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid next size 这样的一个错误,经过了两个小时的调试,最后发现是因为粗心越界导致的。

LZ 把这个错误缩减为一个最简单的模型发布出来:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main (void)
 6 {
 7         char *p = NULL;
 8 
 9         // 在堆空间申请 8 字节的内存
10         p = malloc(8);
11 
12         // 实际使用超过 8 字节
13         strncpy(p, "abcd", 128);
14         // 可以正常打印
15         printf("p = %s
", p);
16 
17         // 释放内存时会报 invalid next size 错误
18         free(p);
19 
20         return 0;
21 }

编译运行:

>$ gcc -Wall free.c -o free
>$ ./free
p = abcdefghijklmn
*** glibc detected *** ./free: free(): invalid next size (fast): 0x00000000020c3010 ***
...此处生略 n 行...

打印是不受影响的,但其实在 strncpy(3) 的时候就已经越界了,所以发生什么情况都是正常的。

另外对于上面这个栗子,使用 strcpy(3) 替代 strncpy(2) 就不会报错了,但是一旦要拷贝的字符超过了 8 个字节,依然可能引发错误。

所以大家在使用内存的时候一定要注意长度,千万不可越界。

免责声明:文章转载自《C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇adobe reader安装失败时的解决方法Quartz2D简单使用(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux学习 : 移植qt 5.6.3 及 tslib 1.4

                             (一) 移植 qt5.6.3 一、qt简介:   Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object...

Linux 通过安装vncserver,客户端远程连接展示图形化界面

Step 1: 安装vncserver和其依赖的软件 # 修改yum为国内镜像 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup-linux && wget -O /etc/yum.repos.d/CentOS-Base.repo h...

Centos6.5安装nodejs13

下载nodejs13二进制压缩包,解压后运行./node提示缺库文件。在网上面试并试了好多次后,记录一下。 缺失库文件的错误提示:   [root@localhost bin]# ./node   ./node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (req...

gcc工具链简述

工具链软件包括BINUTILS、GCC、GLIBC、GDB等。 BINUTILS是二进制程序处理工具,包括链接器、汇编器等目标程序处理的工具。 GCC(GNU Compiler Collection)是编译器。对于C/C++语言的完整支持,需要支持glibc库。 GLIBC是应用程序编程的函数库软件包,可以编译生成静态库和共享库。完整的GCC需要支持gli...

Linux编译不同版本glibc(转载)

转载自:https://blog.csdn.net/qq_40827990/article/details/89295472 方法步骤 在http://ftp.gnu.org/gnu/glibc/网站下载你需要的glibc版本 解压下载的文件,同时在本目录下创建一个bulid文件夹,在其他目录下建立一个glibc-x.xx目录: 1 tar -zxvf...

glibc源码下载

https://www.gnu.org/software/libc/ Download sources Releases are available by source branch checkout via git and tarball via ftp. Checkout the latest glibc 2.27 stable release: gi...