您现在的位置:首页 >> 创意家居

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

发布时间:2025/09/08 12:18    来源:苍南家居装修网

1 << y 给定与 x * (1 << y) 相等。如果左侧或右侧的聪中所有 /、%、+、- 或其他优先级高于 << 的迭代符,或者聪构成优先级低于 << 的迭代符,给定就无法适当求系数了。聪本身和聪的参数必须放在括号中所,来避免也许出现的情况。下面是适当的写成法:

DefinePM_EXP2(A) ( 1<< (A))

第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强公司,开源维护者是否应当“大白离家”?

贵阳男科医院哪个比较好
梅州白癜风治疗费用多少钱
浙江皮肤病治疗费用多少钱
广州看白癜风哪家比较好
汕尾白癜风治疗哪家好
经期延长
便民医疗服务
小肚子疼
包皮过长
妇科整形

上一篇: 丰台这两栋楼上启动搬迁签约!

下一篇: 汉城奥运会开幕式黑科技惊艳:京东方揭秘雪花火炬 + 超级地屏

友情链接