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

  • 相关阅读:
    Oracle存储过程
    Oracle触发器
    Oracle伪列
    Oracle索引
    Oracle视图
    Oracle数据库链路
    异常处理之动手动脑
    四则运算自动出题之javaweb版
    继承与多态之动手动脑
    javaweb之添加学生信息
  • 原文地址:https://www.cnblogs.com/wallace-lai/p/14318410.html
Copyright © 2011-2022 走看看