前段时间在Mac版vscode中安装了LeetCode插件,以为可以轻松地在 vscode中刷LeetCode了。但是遇到了heap-buffer-overflowed的问题,一开始几经思索毫无头绪,所以就放弃追究原因了。
但是这几天突然又遇到了这个问题,发现是因为在 vscode 中写 for 循环的时候,code snippet 给出的是这种样子:
for (size_t i = 0; i < count; i++) {
/* code */
}
循环变量 不是 int型的而是 size_t 型的。一般来说也没啥问题,但是一旦遇到循环变量 自减 的时候问题就来了,这种问题让我防不胜防,百思无解。后来经过不断的努力验证,找到了其症结所在。分析如下:
size_t是无符号长整型,因为没有注意到这个无符号,可把我害惨了😭。a=0 的时候:
- 如果
a是int型,那么a--的结果是a=-1, - 如果
a是size_t型,那么a--的结果是a=-1? No,a=18446744073709551615即0xFFFFFFFFFFFFFFFF。 - 当去判断
a >= 0的时候a永远不会小于0。因此要以此作为结束循环的条件是不行的。
最好不要用无符号的变量作为循环变量或者数组下表,因为一不小心可能就越界了,而且不容易想到。
/*size_t是无符号长整型*/
typedef unsigned long size_t;
size_t a = 0;
a--;
if (a>=0) {
printf("a->%ld,Yes\n",a);
} else {
printf("a->%ld,No\n",a);
}
//输出
//a->-1,Yes
if (a>=1000000) {
printf("a->%lu,Yes\n",a);
} else {
printf("a->%lu,No\n",a);
}
//输出
//a->18446744073709551615,Yes
下面是我遇到问题的LeetCode题目
剑指 Offer 53 - I. 在排序数组中查找数字 I
int my_search(int *nums, int l, int r, int target)
{
if (l == r)
{
return nums[l] == target ? 1 : 0;
}
int n = 0;
int mid = (l + r + 1) / 2;
if (nums[mid] == target)
{
//for (size_t i = mid - 1; i >= l && (nums[i] == target); n++, i--)
//下标会越界
for (int i = mid - 1; i >= l && (nums[i] == target); n++, i--)
;
//for (size_t i = mid + 1; i <= r && (nums[i] == target); n++, i++)
//下标会越界
for (int i = mid + 1; i <= r && (nums[i] == target); n++, i++)
;
return n + 1;
}
else if (nums[mid] > target)
{
return my_search(nums, l, mid - 1, target);
}
else
{
return my_search(nums, mid, r, target);
}
}
int search(int *nums, int numsSize, int target)
{
if (!numsSize)
return 0;
if (target < nums[0] || target > nums[numsSize - 1])
return 0;
return my_search(nums, 0, numsSize - 1, target);
}
本文分享了在VSCode中使用LeetCode插件时遇到的heap-buffer-overflowed问题,具体分析了由于codesnippet提供的size_t类型循环变量在自减操作时导致的数组越界问题,并给出了解决方案。

3956

被折叠的 条评论
为什么被折叠?



