[英]addressSanitizer: heap-buffer-overflow on address
我刚开始学习 C。
我正在尝试编写一个函数来打开一个文件,读取一个BUFFER_SIZE
,将内容存储在一个数组中,然后跟踪字符'\\n'
(因为我想获取输入的每一行)。
当我将BUFFER_SIZE
设置BUFFER_SIZE
非常大时,我可以获得第一行。 当我将BUFFER_SIZE
设置BUFFER_SIZE
相当小(比如,42)还不是第一行的结尾时,它会在最后打印出一些奇怪的符号,但我想这是我自己代码中的一些错误。
但是,当我将BUFFER_SIZE
设置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=address 标志?
什么是堆缓冲区溢出?
什么是地址和线程? 在屏幕上看到彩色线的标志是什么?
以及为什么它说“在地址读取大小为 1..”?
我真的很感激 <3
什么是 fsanitizer=address 标志?
通常 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);
简单来说,它是使用 new 关键字创建的变量的分段错误,因为所有进入内存的堆区域。
解释- 您正在尝试访问尚未声明变量的地址,以查找所有此类错误,重新访问所有条件并检查您是否正在访问越界的内容。
这个错误在c++中也会发生。 我在从越界(即 i>n 或 i<0)的数组中访问索引 i 的元素时观察到了这一点。 这基本上发生在我们尝试访问一些不允许我们访问的内存时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.