• C++编译器优化产生的bug


    long length = OSS_INT64_MAX - 1;

    long offset = OSS_INT64_MAX - 1;

    if (offset < 0) // check 1

    {

      rc = SDB_INVALIDARG;

      goto error;

    }

    if (0 == length || length < -1) // check 2

    {

      rc = SDB_INVALIDARG;

      goto error;

    }

    if (length > 0 && offset + length < 0) // check 3

    {

      rc = SDB_INVALIDARG;

      goto error;

    }

    “check 3”的目的是校验offset + length 的值是否溢出。在debug编译下,“check 3”会执行。但在release模式下,“check 3”不会执行。原因估计是在release模式下,编译器根据“check 1”和“check 2”判断,觉得“check 3”是多余的,于是把这段代码优化删除掉了。

    为了绕过这个优化,可如下修改源码:

    if (length > 0 && (OSS_INT64_MAX  - offset - length) < 0) // check 3

    {

      rc = SDB_INVALIDARG;

      goto error;

    }

  • 相关阅读:
    12.20个人任务总结
    典型用户和用户场景描述
    12.19冲刺总结
    12月18日任务总结
    构建之法阅读笔记02
    构建之法阅读笔记03
    构建之法阅读笔记01
    软件工程个人作业01
    内容提供者
    Pull解析Xml
  • 原文地址:https://www.cnblogs.com/withmybag/p/8810538.html
Copyright © 2020-2023  润新知