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


没有LTO , eFree调用看上去像一个未知的外部函数 , 所以memset会保留 。
第4名:不合理的检查和Unreal引擎
最近 , 我们加强了对于Unreal引擎的检查 。 我们来看看分析器发现了什么问题 。
V547(https://pvs-studio.com/en/docs/warnings/v547/)表达式'm_trail == 0'始终未false 。

std:: size_tm_trail; ....inlineintcontext::execute( constchar* data, std:: size_tlen, std:: size_t& off) {....caseMSGPACK_CS_EXT_8: { uint8_ttmp; load< uint8_t>(tmp, n); m_trail = tmp + 1; if(m_trail == 0) { unpack_ext(m_user, n, m_trail, obj);intret = push_proc(obj, off); if(ret != 0) returnret; }else{ m_cs = MSGPACK_ACS_EXT_VALUE;fixed_trail_again = true; }} break; ....}我们来看看这段代码的问题 。
tmp变量是uint8_t类型 , 它的值为8比特 , 即[0, 255] 。 作者认为tmp可以为255 。 在m_trail = tmp +1赋值之后 , 作者检查有没有发生整型溢出 , 因为无符号整数运算可能会导致值回到起点 。 因此 , tmp + 1操作可能为0 。
但是 , 分析器指出 m_trail == 0永远为false 。 我们来看看为什么 。
首先 , 回忆一下std::common_type 。
该行代码包含加法运算 。 对于值和其他类型之间的二元操作 , 编译器使用通常的算数转换 , 对tmp变量实行整数提升 。 因此 , 该表达式中的扩展为1的类型 , 即int 。 这样 , 即使tmp的值是255 , 加法运算也会产生256 。 int类型能够存储该结果 。 因此m_trail==0是无意义的 。
第3名:日期处理函数中的解释错误
在本例中 , 我们的分析器给出了多条警告:
V547 [CWE-571] 表达式'month'始终为true 。
V560 [CWE-570](https://pvs-studio.com/en/docs/warnings/v560/) 部分条件表达式始终为false 。
V547表达式'month'始终为true 。
V560部分条件表达式始终为false 。
首先来看看这段代码 , 它接收一个月份的缩写 , 返回整数值 。
staticconstcharqt_shortMonthNames[][ 4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};staticintfromShortMonthName(QStringView monthName){for( unsignedinti = 0; i < sizeof(qt_shortMonthNames) / sizeof(qt_shortMonthNames[ 0]); ++i) {if(monthName == QLatin1String(qt_shortMonthNames[i], 3)) returni + 1; }return-1; } 如果操作成功 , 函数会返回月份的整数(1到12的整数值) 。 如果月份名称不正确 , 则返回-1 。 注意该函数不可能返回0 。
但是 , 开发人员在调用该函数时 , 认为它在错误情况下会返回0 。 下面是错误使用该函数的代码:
QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format){....month = fromShortMonthName(parts.at( 1)); if(month) day = parts.at( 2).toInt(&ok); // If failed, tryday then month if(!ok || !month || !day) { month = fromShortMonthName(parts.at( 2)); if(month) { QStringView dayPart = parts.at( 1); if(dayPart.endsWith( u'.')) day = dayPart.chopped( 1).toInt(&ok); }}....} 这段程序永远不可能运行月份值为0的情况 , 只会使用错误的月份值继续运行 。
第2名:不注意导致的错误
V726(https://pvs-studio.com/en/docs/warnings/v726/)试图使用'free'函数释放包含'wbuf'数组的内存 , 但由于'wbuf'建立在堆栈中 , 因此是不正确的 。
  • 特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。