首页 > 其他分享 >Bug | priority_queue.size()无符号整型进行减法运算引发的惨案

Bug | priority_queue.size()无符号整型进行减法运算引发的惨案

时间:2024-08-11 15:54:28浏览次数:12  
标签:priority int long queue heap 减法 Bug size

问题描述:使用优先队列(priority_queue)来实现大根堆和小根堆。在维护两个堆平衡的过程中,需要使用 priority_queue.size() 来判断两个堆的大小。因为 .size() 返回的是无符号类型,直接进行减法运算会导致错误。

错误代码

if(max_heap.size() - min_heap.size() > 1) Balance(1);
else if(min_heap.size() - max_heap.size() > 1) Balance(0);

对无符号类型进行减法运算时,如果结果为负数,C++ 会将其转换为一个非常大的无符号整数。这可能会导致条件判断失误,进而导致代码逻辑错误。


正确代码

(1)推荐:避免直接对无符号类型进行减法运算

if(max_heap.size() > min_heap.size() + 1) Balance(1);
else if(min_heap.size() > max_heap.size() + 1) Balance(0);

(2)不推荐:实在想用减法就用一个整型捕捉减法的结果

int cmp = max_heap.size() - min_heap.size();
if(cmp > 1) Balance(1);
else if(cmp < -1) Balance(0);

理解示例代码

#include<iostream>
#include<queue>
#include<typeinfo>
using namespace std;
priority_queue<int> heap;

int main(){
	unsigned a=0, b=4;
	if(a - b > 1){
		cout << "a - b = " << a-b << endl;
		cout << "type of a: " << typeid(a).name() << endl;
		cout << "type of b: " << typeid(b).name() << endl;
		cout << "type of priority_queue.size(): " << typeid(heap.size()).name() << endl;
	}
	return 0;
}

示例代码输出

a - b = 4294967292
type of a: j
type of b: j
type of priority_queue.size(): y
表1:typeid().name()输出符号与实际变量类型对照表
typeid().name()实际类型
bbool
cchar
asigned char
hunsigned char
s(signed) short (int)
t(unsigned) short (int)
i(signed) int
j(unsigned) int
l(signed) long (int)
m(unsigned) long (int)
x(signed) long long (int)
y(unsigned) long long (int)
ffloat
ddouble
elong double


经验总结

(1)判断条件:尽量不要用减法,避免无符号整型减法造成的错误。

(2)priority_queue.size() 返回的类型是无符号类型,不适合直接作差。

标签:priority,int,long,queue,heap,减法,Bug,size
From: https://blog.csdn.net/Junseer/article/details/141105642

相关文章

  • bugbountyhunter scope BARKER:第7滴血 存储型 XSS 编码测试和多处引用 报告
    注册后,来到UIDisplayName处直接点击更新之后,发现反射值的存在尝试一些编码,发现没有任何转换。编码测试更简单,语义一把梭:比如各种华丽花哨的编码到落地并没有被还原成<>'"等语义,此处没有漏洞https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSSInjectio......
  • Debug Log - ModuleNotFoundError: No module named 'timm.models.layers.patch_embed
    运行代码:importtimmimporttorchmodel=timm.create_model('deit_small_patch16_224',pretrained=True,num_classes=6,pretrained_cfg_overlay=dict(file='/home/lingdu/zyt/works/pretrained_models/deit_small_patch16_224-cd65a1......
  • 开发提效之-远程debug调试
    一、问题与现状1.开发调试现状当我们的代码在线上/测试环境运行出现异常或者业务处理出现问题时,需要进行问题定位,之前的传统做法是:1)查看异常日志,根据日志定位到出错代码,然后再根据相关参数及异常信息进行推断。2)当属于业务上存在问题,导致了数据处理错误,则需要通过在业务代......
  • LeetCode | 225 Implement Stack Using Queues
    分析阻塞(Blocking)阻塞操作指的是在调用一个函数或方法时,如果该操作不能立即完成(例如,因为需要等待某个事件的发生,如数据达到或资源可用),那么当前线程或进程会被挂起(暂停执行),直到操作完成为止。在这个等待期间,线程或进程无法执行其他任务。等待:调用方必须等待操作完成独......
  • BugKu CTF Misc:眼见非实 & 啊哒 & ping & Snowfall
    前言BugKu是一个由乌云知识库(wooyun.org)推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。BugKu旨在提供一个实践和学习网络安全的平台,供安全爱好者和渗透测试人员进行挑战和练习。它包含了各种不同类型的漏洞场景,如Web漏洞、系统......
  • git --- 合并分支(bugfix ---> master)
    普通合并普通合并是将要合并的分支的更改逐个提交到目标分支上。以下是普通合并的步骤:步骤1:切换到目标分支,也就是要将更改合并到的分支上。gitcheckout目标分支名称步骤2:执行合并命令。gitmerge要合并的分支名称步骤3:解决冲突(如果有)。如果在合并过程中出现冲突,需......
  • C++标准模板库(STL)|容器|vector| queue|
    对STL进行总结,STL是standardtemplatelibrary的简写,是C++中的一个标准模板库,用于实现常用的数据结构和算法,它是C++程序员经常使用的一个工具箱。STL的主要目的是提高开发效率和代码质量,使得程序员可以更加便捷地完成常见的操作。里面包括:算法(algorithm)、容器(container)、仿函......
  • 使用dynamic debug帮助调试
    你一定在kernelsourcecode中看过很多pr_debug()/dev_dbg()/print_hex_dump_debug()吧,这些debug语句提供更多的信息帮助我们了解内核运行流程或是定位问题,可以在运行时按per-callsite单独开启/关闭。那我们来看一下它是如何实现和使用的吧。一、kernel configuration在编译时,......
  • BUG: 传输的uicode码转汉字显示部分错误
    1.BUG描述pc下发文本信息,采用unicode编码形式,下位机单元接收后,需要将其解码成utf-8的编码形式显示出来,但是发现文本首部和尾部出现乱码。2.BUG原因原因很简单,解码的时候尾部和首部没有对齐。记录这个BUG主要是记录下汉字的编码方法。3.修复方法解码时对齐即可。4.unicode编......
  • Debug:调用MIG IP核
    MIGIP核功能:        MIGIP核主要用于帮助设计人员轻松地建立各种类型的存储器接口,包括DDR(DoubleDataRate)SDRAM(同步动态随机存取存储器)、DDR2、DDR3、DDR4等。问题描述        当我们遇到了如图所示的TheConfigurationPinPUDC_Bisusedforallthe......