一个因编码习惯不正确而产生的BUG

一个因编码习惯不正确而产生的BUG

今天在刷力扣的时候,遇到了一个让我困惑不已的BUG。在我本地的VS Code上没有产生任何报错,但是一旦提交给力扣则报heap-buffer-overflow的内存错误。经过一番仔细的代码检测,发现BUG是因为不正确的编码习惯造成的。

有BUG的代码片段如下:

for (int i = 0; i <= sz; ++i) {
    int idx = 0;
    while (nums[idx] < i && idx < sz) ++idx;
    cnt[i] = sz - idx;
}

看出问题来了吗?问题不在i <= sz,而在while (nums[idx] < i && idx < sz) ++idx;这一行上面。C语言中,&&是短路运算符,一旦第一个条件不满足则不会对后续的条件进行判断。而代码中对idx范围的判断语句idx < sz放在了涉及到访存的判断语句nums[idx] < i的前面,这是产生BUG的根本原因。将idx < sz放在nums[idx] < i前面则可以杜绝该BUG的产生。

这个BUG给我带来的启示:

(1)当使用&&连接多个判断语句时,对下标范围的判断一定要放在涉及到访存的判断语句的前面。
(2)有必要学习内存检测工具的使用,对所写代码做更加严格的检查。

原文地址:https://www.cnblogs.com/wallace-lai/p/14318410.html