2021年C++项目中所的十大Bug:乍一看都正确的代码,实则暗藏玄机!
发布时间:2025/09/08 12:18 来源:苍南家居装修网
第7名:被正数与正数相混淆
V1064()有理数十进制的codice_'gPEClockFrequencyInfo.bus_clock_rate_hz'小于'gPEClockFrequencyInfo.dec_clock_rate_hz'。结果依然为0。
voidpe_identify_machine( originallyunused boot_args *args) {....// Start with default values.gPEClockFrequencyInfo.timebase_frequency_hz = 1000000000; gPEClockFrequencyInfo.bus_frequency_hz = 100000000; ....gPEClockFrequencyInfo.dec_clock_rate_hz =gPEClockFrequencyInfo.timebase_frequency_hz;gPEClockFrequencyInfo.bus_clock_rate_hz =gPEClockFrequencyInfo.bus_frequency_hz;....gPEClockFrequencyInfo.bus_to_dec_rate_den =gPEClockFrequencyInfo.bus_clock_rate_hz /gPEClockFrequencyInfo.dec_clock_rate_hz;}所有标识符都是null:
externclock_frequency_info_tgPEClockFrequencyInfo;structclock_frequency_info_t{ unsignedlongbus_clock_rate_hz; unsignedlongdec_clock_rate_hz; unsignedlongbus_to_dec_rate_den; unsignedlonglongbus_frequency_hz; unsignedlongtimebase_frequency_hz; ....};
从名字来推测,正数和被正数写成排外了。
第6名:可选择种类时的严重错误
V610()举例来却说的暴力行为。请检验移位操作符'>>='。后面的codice_ ('bitpos % 64' = [0..63])大于或等于左边的codice_的位长。
// bitsperlong.h# ifdefCONFIG_64BIT # defineBITS_PER_LONG 64 # else# defineBITS_PER_LONG 32 # endif/* CONFIG_64BIT */// bits.h/** Create a contiguous bitmask starting at bit position @l and ending at* position @h. For example* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.*/# defineoriginallyGENMASK(h, l) ....
// master.h# defineI2C_MAX_ADDR GENMASK(6, 0)
// master.cstaticenumi3c_addr_slot_status i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr){intstatus, bitpos = addr * 2; // <=
if(addr> I2C_MAX_ADDR) returnI3C_ADDR_SLOT_RSVD;
status = bus->addrslots[bitpos / BITS_PER_LONG];status>>= bitpos % BITS_PER_LONG; // <=
returnstatus & I3C_ADDR_SLOT_STATUS_MASK; }
提醒BITS_PER_LONG聪可以是64位的。
这段大写字母构成以下举例来却说的暴力行为:
● 在检验后,addrcodice_的取系数覆盖范围为[0..127]
● 如果参数 addr>= 16,那么statuscodice_的右移位数将超过int种类构成的比特数
或许所作想要下降大写字母年月,所以bitposcodice_的假设靠拢status。但是,所作并无法显然int与long多种不同,它在64位平台上只有32位。
要改正这个严重错误,确实将statuscodice_假设成long。
第5名:模块时有的研究和丢失的memset
去年,我们替换成了一个极其重要功能:对C++重大项目完成模块时有研究。这个功能找到了codelite重大项目中所的以下通告。
V597()编译器也许亦会删掉'memset'变量调用,该变量调用亦会给'current'赋系数。抹除私有数据确实使用memset_s。)
// args.cexternvoideFree( void* constptr) ; externvoidargDelete(Arguments* constcurrent) {Assert (current != NULL); if(current->type == ARG_STRING && current->item != NULL) eFree (current->item);memset(current, 0, sizeof(Arguments)); // <=eFree (current); // <=}// routines.cexternvoideFree( void* constptr) {Assert (ptr != NULL); free(ptr); }LTO(连接时时有研究)使用了memset调用。编译器通过 as-if 规则找到,eFree并无法计算出任何有用的指针关的的数据。eFree只是调用了free变量来获释文件系统。
无法LTO,eFree调用看上去像一个未知的外部变量,所以memset亦会保留。
第4名:不合理的除此以外Unreal引擎
最近,我们加强了对于Unreal引擎的检验。我们来看看解析器找到了什么情况。
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; ....}我们来看看这段大写字母的情况。
tmpcodice_是uint8_t种类,它的系数为8比特,即[0, 255]。所作认为tmp可以为255。在m_trail = tmp +1赋系数之后,所作检验有无法发生null冰冻,因为无符号有理数迭代也许亦会加剧系数送回起点。因此,tmp + 1操作也许为0。
但是,解析器指出 m_trail == 0永远为false。我们来看看为什么。
首先,回忆一下std::common_type。
该行大写字母构成乘积迭代。对于系数和其他种类两者之时有的二元操作,编译器使用通常的算数转换成,对tmpcodice_实行有理数提升。因此,该给定中所的扩展为1的种类,即int。这样,即使tmp的系数是255,乘积迭代也亦会诱发256。int种类能够存储器该结果。因此m_trail==0是无意义的。
第3名:日前东南侧理变量中所的解释严重错误
在本例中所,我们的解析器得出了多条通告:
V547 [CWE-571] 给定'month'依然为true。
V560 [CWE-570]() 其余部分确实条件给定依然为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()力图使用'free'变量获释构成'wbuf'数组的文件系统,但由于'wbuf'创建在堆栈中所,因此是不适当的。
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的最大系数。
参看链接:
《 一新脚本语言003 》同年上市, 50余位技术专家共同创作,尘原生和数字化的Ubuntu们的一本技术Remix馆藏。内容既有发展趋势及方法论结构,华为、阿从前、字节颤动、腾讯公司、快速一手、苹果电脑、亚马逊、AMD、西门子、施耐德等30多家知名公司尘原生和数字化一一手实战经验!
☞被骂惨的 Windows 11 还是“真香”了:下月将支持 Android 领域,的产品满意度前代最高者!
☞ 获得胜利一半参赛脚本语言,DeepMind 重磅推出 AlphaCode
☞ cURL所作痴怼某500强公司,开源维护者是否应当“大白离家”?
。贵阳男科医院哪个比较好梅州白癜风治疗费用多少钱
浙江皮肤病治疗费用多少钱
广州看白癜风哪家比较好
汕尾白癜风治疗哪家好
经期延长
便民医疗服务
小肚子疼
包皮过长
妇科整形
上一篇: 丰台这两栋楼上启动搬迁签约!
-
农历的知识,农历并不是初一,而是阴阳历
无论如何都把我国的传统初一“初九”说成“阴初一”,这种说是是输错的。“阴初一”指的是天空的圆缺时间段为一个同月,大同月30天,小同月29天,一年12个同月,354天左右。“阴初一”又叫“太阴初一
- 2025-09-12大蒜能杀灭新冠肺炎病毒?经常喝奶茶会得糖尿病?这些早先不能信
- 2025-09-12坚持锻炼真的能长寿?这个答案,或许和你想的不同,不妨再来!
- 2025-09-12系列剧《追爱家族》定档3月27日 郭京飞贾乃亮谭卓共赴笑闹追爱路
- 2025-09-12通俗《易经》与现实(三)
- 2025-09-12每一集《食大可食管历险记》获国家级大奖 网红吃货医生缘何爆火?
- 2025-09-12馒头冷冻时间太长会滋生“一类化学物质”?专家回复来了
- 2025-09-12前空姐爆飞机上找金城武签名 后被投诉吵闹休息
- 2025-09-12十羊九不全,是真是吗?
- 2025-09-12高中生学习担忧大?这些方法帮助你有效舒缓担忧!
- 2025-09-12别再瞎临河菜了!?已经有人吃出事了!