LeetCode 使用size_t 报heap-buffer-overflow

本文分享了在VSCode中使用LeetCode插件时遇到的heap-buffer-overflowed问题,具体分析了由于codesnippet提供的size_t类型循环变量在自减操作时导致的数组越界问题,并给出了解决方案。

前段时间在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 的时候:

  • 如果 aint 型,那么 a-- 的结果是 a=-1,
  • 如果 asize_t 型,那么 a-- 的结果是 a=-1 ? No, a=184467440737095516150xFFFFFFFFFFFFFFFF
  • 当去判断 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值