ERROR: AddressSanitizer: heap-buffer-overflow on address

本文解析了一个LeetCode上的程序错误报告,该错误涉及堆缓冲区溢出的问题。详细展示了发生错误的具体位置及原因,并通过内存区域的阴影字节来辅助理解问题所在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode报错

=================================================================
==42==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000078 at pc 0x00000034be41 bp 0x7fffeb1a37c0 sp 0x7fffeb1a37b8
READ of size 4 at 0x602000000078 thread T0
    #2 0x7f5de0ff10b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x602000000078 is located 0 bytes to the right of 8-byte region [0x602000000070,0x602000000078)
allocated by thread T0 here:
    #6 0x7f5de0ff10b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa fd fa fa fa fd fa fa fa fd fa fa fa 00[fa]
  0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==42==ABORTING

数组越界或者空指针

### 解决AddressSanitizer检测到的堆缓冲区溢出问题 为了修复AddressSanitizer报告的`heap-buffer-overflow`错误,需要仔细审查并修正可能导致越界的代码逻辑。以下是具体的解决方案: #### 1. 审查内存分配与释放 确保每次动态分配内存时都经过合理的调整和验证。例如,在C/C++中可以使用自定义函数来处理内存请求,如`adjust_size`所示[^2]。 ```c static int adjust_size(size_t *n) { if (*n - 1 > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) { if (*n) { errno = ENOMEM; return -1; } else { *n = SIZE_ALIGN; return 0; } } *n = (*n + OVERHEAD + SIZE_ALIGN - 1) & SIZE_MASK; return 0; } ``` 此方法通过增加额外开销(`OVERHEAD`)并对齐至特定边界(`SIZE_ALIGN`),从而减少因不对齐造成的潜在风险。 #### 2. 验证数组索引合法性 编译器不会自动检查下标是否超出范围;因此,应该显式地加入边界条件判断以防止非法访问。对于涉及指针运算的操作尤其重要,比如下面的例子展示了如何安全获取数组元素[^4]。 ```cpp // 假设有一个长度为len的int型数组arr if(index >= 0 && index < len){ value = arr[index]; }else{ // 错误处理机制 fprintf(stderr, "Index out of bounds\n"); exit(EXIT_FAILURE); } ``` #### 3. 使用NOP填充保护区域 当存在未使用的空间时,可以通过插入无操作指令(NOP滑板),即机器码中的`\x90`字节序列来进行占位,这有助于避免意外跳转到这些位置执行恶意代码[^1]。 ```assembly section .text global _start _start: ; 正常程序入口... align 16 ; 对齐到16字节边界 nop ; 占位用的NOP指令 times 15 db 0x90 ; 继续填充剩余的空间直到满足对齐要求 ``` 以上措施能够有效降低发生堆缓冲区溢出的概率,并提高系统的安全性。当然,最根本的办法还是在于编写严谨、健壮的应用程序代码,遵循良好的编程实践原则。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值