一个因编码习惯不正确而产生的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)有必要学习内存检测工具的使用,对所写代码做更加严格的检查。