从goahead代码的bug看aarch64平台的移位操作

2024-02-24 15:38

本文主要是介绍从goahead代码的bug看aarch64平台的移位操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设在32位arm平台的一个移位操作

int bit = 1<<30;

这是合法的。

那么平台换成了64位arm,

int bit = 1 << 34;

合法吗,显然不合法,因为int的长度就是32 比特,不管32位arm还是64位arm上。要移动34位显然超出了它的表示范围。

我们知道在aarch64架构下,long是64位的,那么改成:

long bit = 1 << 34 合法吗。并不。因为这里的1 其实是个int型,默认的嘛。长度仍然是32位!所以对一个32位的int型移位34 显然也不合法。

那么只有改成:

long bit = (long)1 << 34

才是正确的。

 

 

这个BUG始于这几天调试的goahead。平台是aarch64 海思。

一旦创建了很多VPSS,也就是创建了很多文件描述符,那么goahead监听的文件描述符就可能很大,goahead做select掩码的时候,不仅仅掩码类型是int,连特么移位的1 也是保持默认的int型。这样整个goahead服务已启动就会不停的select退出,这个服务沙雕。

贴出原有代码:

PUBLIC int socketSelect(int sid, int timeout)

{

WebsSocket *sp;

struct timeval tv;

fd_mask *readFds, *writeFds, *exceptFds;

int all, len, nwords, index, bit, nEvents;

 

/*

Allocate and zero the select masks

*/

nwords = (socketHighestFd + NFDBITS) / NFDBITS;

len = nwords * sizeof(fd_mask);

 

readFds = walloc(len);

memset(readFds, 0, len);

writeFds = walloc(len);

memset(writeFds, 0, len);

exceptFds = walloc(len);

memset(exceptFds, 0, len);

 

tv.tv_sec = timeout / 1000;

tv.tv_usec = (timeout % 1000) * 1000;

 

/*

Set the select event masks for events to watch

*/

all = nEvents = 0;

 

if (sid < 0) {

all++;

sid = 0;

}

 

for (; sid < socketMax; sid++) {

if ((sp = socketList[sid]) == NULL) {

if (all == 0) {

break;

} else {

continue;

}

}

assert(sp);

/*

Initialize the ready masks and compute the mask offsets.

*/

index = sp->sock / (NBBY * sizeof(fd_mask));

bit = 1 << (sp->sock % (NBBY * sizeof(fd_mask)));

if (sp->handlerMask & SOCKET_READABLE) {

readFds[index] |= bit;

}

if (sp->handlerMask & SOCKET_WRITABLE) {

writeFds[index] |= bit;

}

if (sp->handlerMask & SOCKET_EXCEPTION) {

exceptFds[index] |= bit;

}

if (sp->flags & SOCKET_RESERVICE) {

tv.tv_sec = 0;

tv.tv_usec = 0;

}

.................................

注意看加粗部分。bit用于计算掩码位,index用于计算字节数。aarch64上NBBY 和

sizeof(fd_mask)都是8.可见这里bit计算必定会出篓子,自己是int型,用于移位的1也是默认的int.

 

那么如何修改呢?简单,把bit设为long, 1 也强制转换成long 就行了。:

 

long all, len, nwords, index, bit, nEvents;

....

index = sp->sock / (NBBY * sizeof(fd_mask));

bit = (long)1 << (sp->sock % (NBBY * sizeof(fd_mask)));

这样就解决了。

 

 

这篇关于从goahead代码的bug看aarch64平台的移位操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742563

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python