addressSanitizer:地址

时间:2018-07-29 10:12:40

标签: c memory-leaks heap buffer-overflow

我正开始学习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

2 个答案:

答案 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关键字创建的变量全部进入内存堆区域。

说明-您正在尝试访问一个尚未声明其变量的地址,以查找所有此类错误以重新访问所有条件,并检查是否正在访问超出范围的内容不是。