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了一下代码,终于找到问题所在。
附上代码修改前后对比:
![](https://img-blog.csdnimg.cn/img_convert/068c9e0b298ed779f05c51062570417e.png)
图中注释掉的部分是原代码,彩色部分是修改后的代码,问题就出在while循环的判断条件上:
修改前:
//条件1 tasks[i] != diffLevel[j] && 条件2 j < diffLevel.size()
while(tasks[i] != diffLevel[j] && j < diffLevel.size()){
j++;
}
当j == diffLevel.size() - 1且满足条件1时,进入while循环,j自增后的值与diffLevel.size()相同,此时程序继续运行,再代入while循环条件就会存在越界:条件1中diffLevel[j] 越界。
修改后:
while (j < diffLevel.size()){
if (tasks[i] != diffLevel[j]){
j++;
}
else{
break;
}
}
当j == diffLevel.size() - 1时,满足while循环条件,进入循环;若满足if条件,则j自增为diffLevel.size()(边界值),程序继续执行会发现不满足while循环条件,不进入循环,也就不会出现if判断条件中diffLevel[j] 越界的问题了。
执行通过:
![](https://img-blog.csdnimg.cn/img_convert/afe7c921d778cc711c78e9f88aac3e76.png)