Leetcode报错AddressSanitizer: heap-buffer-overflow on address 0x603000000028

  • 1.我们先看代码,贴出来


int singleNumber(int* nums, int numsSize){
    int i = 1;
    int data;
    
    data = nums[0];
    while (i < numsSize) {
        if (data != nums[i]) {
            i++;
        }
        else {
            i += 2;
            data = nums[i+1];
        }
    }
    return data;
}

 

  • 2.题目描述 :leetcode 136 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

 

  • 3.错误信息

代码报了一长串的错误,奇怪的是,在用VSCode环境debug时,并未报错。搜索问题发现,LeetCode 使用了AddressSanitizer检查是否存在内存非法访问,该问题检查内存非法访问问题,发现问题出在这里

else {

            i += 2;

            data = nums[i+1];

        }

 

在data赋值前先进行i+2操作,再执行num[i+1]时既有可能引起i大于size值,使得数组nums[]访问越界,修改后执行ok

 else {

            data = nums[i+1];

             i += 2;

        }

 

  • 4.附上报错信息
==30==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000000028 at pc 0x0000004018d1 bp 0x7ffc7efb9960 sp 0x7ffc7efb9958

READ of size 4 at 0x603000000028 thread T0

    #2 0x7f54691a52e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)



0x603000000028 is located 4 bytes to the right of 20-byte region [0x603000000010,0x603000000024)

allocated by thread T0 here:

    #0 0x7f546a62f2b0 in malloc (/usr/local/lib64/libasan.so.5+0xe82b0)

    #3 0x7f54691a52e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)



Shadow bytes around the buggy address:

  0x0c067fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  0x0c067fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  0x0c067fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  0x0c067fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  0x0c067fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

=>0x0c067fff8000: fa fa 00 00 04[fa]fa fa fa fa fa fa fa fa fa fa

  0x0c067fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c067fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c067fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c067fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

  0x0c067fff8050: 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

==30==ABORTIN

 

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
heap-buffer-overflow是一种错误,通常出现在使用C语言编写代码时。它指的是访问了堆中分配的内存块之外的部分,导致数据越界访问。这种错误可能会导致程序崩溃、数据损坏或者安全漏洞的产生。 在解决heap-buffer-overflow问题时,一般需要以下几个步骤: 1. 首先,需要定位具体出错的位置。可以通过调试工具、代码审查或者日志来追踪错误发生的地方。 2. 确认出错的原因。这可能涉及到对代码的仔细分析,包括内存分配、指针操作等。 3. 修改代码,以确保在访问堆中分配的内存时不会越界。可以通过检查数组边界、指针的有效性来避免这种错误。 4. 进行测试和验证,确保修改后的代码能够正常运行,并且不再出现heap-buffer-overflow错误。 需要注意的是,解决heap-buffer-overflow问题可能会因具体情况而异。每个问题都需要具体分析和处理,确保代码的安全性和正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Leetcode中解决stack/heap-buffer-overflow错误](https://blog.csdn.net/lijianyi0219/article/details/111510086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [buffer_overflow:缓冲区溢出](https://download.csdn.net/download/weixin_42099633/19247971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值