LeetCode 2244 数组越界报错 AddressSanitizer: heap-buffer-overflow

https://leetcode.com/problems/minimum-rounds-to-complete-all-tasks/

报错显示:

===================================================================34==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000b4 at pc 0x000000345fcb bp 0x7ffd2a0479d0 sp 0x7ffd2a0479c8READ of size 4 at 0x6020000000b4 thread T0 #2 0x7f079ece90b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)0x6020000000b4 is located 0 bytes to the right of 4-byte region [0x6020000000b0,0x6020000000b4)allocated by thread T0 here: #4 0x7f079ece90b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)Shadow bytes around the buggy address: 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 fd fa=>0x0c047fff8010: fa fa fd fd fa fa[04]fa fa fa 04 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 0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa faShadow 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==34==ABORTING

查找相关经验帖,应该是数组越界问题,重新review了一下代码,终于找到问题所在。

附上代码修改前后对比:

图中注释掉的部分是原代码,彩色部分是修改后的代码,问题就出在while循环的判断条件上:

修改前:

当j == diffLevel.size() - 1且满足条件1时,进入while循环,j自增后的值与diffLevel.size()相同,此时程序继续运行,再代入while循环条件就会存在越界:条件1中diffLevel[j] 越界。

修改后:

当j == diffLevel.size() - 1时,满足while循环条件,进入循环;若满足if条件,则j自增为diffLevel.size()(边界值),程序继续执行会发现不满足while循环条件,不进入循环,也就不会出现if判断条件中diffLevel[j] 越界的问题了。

执行通过:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值