繁体   English   中英

addressSanitizer:地址上的堆缓冲区溢出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM