2021年C++项目中的十大Bug:乍一看都正确的代码,实则暗藏玄机!( 四 )

  • template< typenameT> staticALWAYS_INLINE voidFormatLogMessageAndPrintW(....){....wchar_twbuf[ 512]; wchar_t* wmessage_buf = wbuf; ....if(wmessage_buf != wbuf) {std:: free(wbuf); }if(message_buf != buf) {std:: free(message_buf); }....} 这段代码触发了警告 。 它试图删除一个栈上分配的数组 , 从而引发了错误 。 数组的内存不是从堆上分配的 ,所以没有必要调用std::free 。 当对象摧毁时 , 内存也会释放 。
    我认为 , 这个警告的原因比警告本身更危险 。
    第1名:不注意导致的更大的错误
    我们一直在警告用户的错误 。 但今年 , 我们自己也犯了错误 。
    V645 'strncat'函数调用会导致'a.consoleText'缓存溢出 。 边界不应该包含缓存的大小 , 而应该包含字符数 。
    structA{charconsoleText[ 512]; };voidfoo(A a){charinputBuffer[ 1024]; ....strncat(a.consoleText, inputBuffer, sizeof(a.consoleText) – strlen(a.consoleText) - 5); ....} 乍一看这段代码似乎是正确的 , 没有未定义错误 。 但仔细看一下这段代码:
    sizeof(a.consoleText) – strlen(a.consoleText) – 5这个表达式可能会产生负数!例如 , 当strlen(a.consoleText) = 508的时候 , 就会产生无符号整数溢出 。 表达式的结果就是结果类型size_t的最大值 。
    参考链接:https://pvs-studio.com/en/blog/posts/cpp/0901/
    《 新程序员003 》正式上市 ,50余位技术专家共同创作 , 云原生和数字化的开发者们的一本技术精选图书 。 内容既有发展趋势及方法论结构 , 华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
    ?被骂惨的 Windows 11 还是“真香”了:下月将支持 Android 应用 , 产品满意度历代最高!
    ? 击败一半参赛程序员 , DeepMind 重磅推出 AlphaCode
    ? cURL作者狂怼某500强公司 , 开源维护者是否应当“白打工”?

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。