作者 | Vladislav Stolyarov译者| 弯月
出品 | CSDN(ID:CSDNnews)
在程序员的新年祝福中 , 大家或多或少会来一句 , 新年编码无Bug、Bug越写越少……对程序员来说 , 无论何时何地 , 绕不去的话题里总有一个是关于Bug的 。 这不 , 本文作者便总结了2021年C++代码中的TOP 10 bug , 或许与你有些许共通之处 。
文章图片
第10名:循环中的输入错误
V533 [CWE-691](https://pvs-studio.com/en/docs/warnings/v533/) for循环内的递增变量错误 , 请检查i 。
void gsk_vulkan_image_upload_regions(GskVulkanImage *self, GskVulkanUploader *uploader, guint num_regions, GskImageRegion *regions) { .... for( inti = 0; i < num_regions; i++){ m = mem + offset; if(regions[i].stride == regions[i].width * 4){ memcpy(m, regions[i].data, regions[i].stride * regions[i].height);} else { for(gsize r = 0; r < regions[i].height; i++) // <= memcpy(m + r * regions[i].width * 4,regions[i].data + r * regions[i].stride, regions[i].width * 4);} .... } .... } 注意内层循环中递增的是变量i , 而不是r 。 无需多说 , 这个错误太经典了 。
第9名:突然变成了HTML!
V735(https://pvs-studio.com/en/docs/warnings/v735/) HTML错误 。"</body>"之前缺少"</ul>"标签 。
QStringQPixelTool::aboutText const{ constQList<QScreen *> screens = QGuiApplication::screens;constQScreen *windowScreen = windowHandle->screen;QStringresult; QTextStreamstr(&result); str<< "<html></head><body><h2>Qt Pixeltool</h2><p>Qt "<< QT_VERSION_STR << "</p><p>Copyright (C) 2017 The Qt Company Ltd.</p><h3>Screens</h3><ul>"; for(const QScreen *screen : screens) str << "<li>"<< (screen == windowScreen ? "* ": " ") << screen << "</li>"; str<< "<ul></body></html>"; returnresult; }
我们提供的检查不仅会检查代码 , 还会检查字符串中的异常 。 上述代码就触发了这个检查 。 这种情况很罕见 。
作者想要创建一个列表 , 但添加了两个<ul>标签 , 导致了这个错误 。 这显然是输入错误 。 第一个标签开始列表 , 而第二个标签应该结束列表 。 下面是正确的代码:
str<< "</ul></body></html>"; 第8名:不安全的宏
【2021年C++项目中的十大Bug:乍一看都正确的代码,实则暗藏玄机!】V634(https://pvs-studio.com/en/docs/warnings/v634/)中 运算符'*'的优先级高于'<<' 。 建议在此表达式中使用括号 。
# definePM_EXP2(A) 1 << A intprocess_val( constu_int8_t*data, u_int32_tdata_len, u_int32_t*retvalue, ....) {*retvalue = https://www.sohu.com/a/0; ..../* Now find the actual value */for(; i < data_len; i++) { *retvalue += data[i] * PM_EXP2( 8* (data_len - i - 1)); }return( 0); }
分析器警告说 , 在展开两个宏之后 , 可能会产生不正确的表达式 。 函数首先将一个函数乘以1 , 然后执行移位操作 。 幸运的是在这一行中 x * 1 << y 表达式与 x * (1 << y) 相等 。 如果左侧或右侧的宏中有 /、%、+、- 或其他优先级高于 << 的运算符 , 或者宏包含优先级低于 << 的运算符 , 表达式就无法正确求值了 。 宏本身和宏的参数必须放在括号中 , 来避免可能出现的问题 。 下面是正确的写法:
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。