我正开始学习C。
我试图编写一个函数来打开文件,读取BUFFER_SIZE
,将内容存储在数组中,然后跟踪字符'\n'
(因为我想获取输入的每一行)。
当我将BUFFER_SIZE
设置得很大时,我可以得到第一行。当我将BUFFER_SIZE
设置为相当小(例如42)时(它还不是第一行的末尾),它会在末尾打印出一些奇怪的符号,但我想这是我自己的代码中的错误。 / p>
但是,当我将BUFFER_SIZE
设置得非常小时,例如= 10,并且我使用-fsanitizer=address
来检查内存泄漏。它会抛出错误的怪物:
==90673==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000fb at pc 0x000108868a95 bp 0x7fff573979a0 sp 0x7fff57397998
READ of size 1 at 0x6020000000fb thread T0
如果有人可以从一般意义上解释我:
fsanitizer =地址标记是什么?
什么是堆缓冲区溢出?
什么是地址和线程?在屏幕上以彩色显示线程的标志是什么?
以及为什么说“在地址读取大小为1。”?
我非常感谢<3
答案 0 :(得分:4)
什么是fsanitizer =地址标记?
通常,C编译器不会为内存访问添加芽接检查。 有时,由于代码错误,缓冲区外会进行读取或写入操作,因此通常很难检测到这种错误。 使用此标志,编译器将添加一些绑定检查,以确保您不会使用缓冲区来超出其分配范围。
什么是堆缓冲区溢出?
使用数组在分配后到达
char* x = malloc(10);
char n=x[11]; //heap-buffer-overflow
(下溢要在分配之前达到)
char* x = malloc(10);
char n=x[-11]; //heap-buffer-underflow
什么是地址和线程?
地址是内存中的位置,线程是进程运行代码的一部分。
以及为什么说“在地址读取大小为1。”?
这意味着您从给定地址读取单个字节
我认为您的问题是您为缓冲区分配了BUFFER_SIZE
并将相同的BUFFER_SIZE
读入其中。
正确的方法是始终声明至少一个字节,然后再读取。
像这样:
char* buff = malloc(BUFFER_SIZE+1);//notice to +1
fread(buff,1,BUFFER_SIZE,fp);
答案 1 :(得分:0)
简单地说,这是分段错误,因为使用new关键字创建的变量全部进入内存堆区域。
说明-您正在尝试访问一个尚未声明其变量的地址,以查找所有此类错误以重新访问所有条件,并检查是否正在访问超出范围的内容不是。