开发笔记之:文件读取值溢出bug分析(JAVA版)

news2024/11/19 10:44:00

(1)引言

 以下是Java读取数据文件(FileInputStream)的代码:

	/**
	 * 按双字读取
	 * @param fis						文件输入流
	 * @param isBigEndian				是否大头(字节序)
	 * @return				双字值 | <code>-1</code>表示EOF
	 */
	public long readAsDword(FileInputStream fis, boolean isBigEndian) {
		int[] bytes = new int[] { -1, -1, -1, -1 };
		try {
			bytes[0] = fis.read();
			bytes[1] = fis.read();
			bytes[2] = fis.read();
			bytes[3] = fis.read();
		} catch (IOException e) {
			。。。
		}
		//EoF checking
		if((-1 == bytes[3])||(-1 == bytes[2])||(-1 == bytes[1])||(-1 == bytes[0])) {
			return (-1);
		}
		if(isBigEndian) { //big-endian: 00 01 02 03
			return ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]);
		} else { //little-endian: 03 02 01 00
			return ((bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0]);
		}
	}

 其意图很简单:从当前游标位置读取一个双字(4字节)数据。
稍微复杂一点的就是一个字节序的考虑。

(2)问题

 该代码做UT(单元测试)时,遇到了读取中断的问题(就是文件还没读取完就提前中断了)。以下是数据文件内容:
数据文件sample中断的原因就是返回值为约定的 -1
经调试跟踪,在读取第1个 0xFFFFFF 时,每个字节的读取都正常(255 < Integer.MAX_VALUE),问题发生在代码的 return 语句处,返回 -1值了:

return ((bytes[0] << 24)|(bytes[1] << 16)|(bytes[2] << 8)|bytes[3]);

也就是说,发生了值溢出
原因也立刻明了:数组bytes的元素的类型为int,当赋值 0xFFFFFF (>Integer.MAX_VALUE) 时产生溢出。

(2.1)对策
  1. 在return语句处,将bytes的元素的值强制扩展为long,如下:
return (((long)bytes[0] << 24)|((long)bytes[1] << 16)|((long)bytes[2] << 8)|(long)bytes[3]);
  1. 将数组bytes的元素的类型扩展为long也可。如下:
long[] temp = new long[] { -1L, -1L, -1L, -1L };
(3)结论

数据文件读取溢出需关注的点:

  1. 目标的值域范围(宁大勿小,例如:能用long就不要用int)
  2. 数值计算过程中的值溢出
(4)相关文档
  1. 开发笔记之:文件读取值溢出bug分析(QT C++版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2 axios请求后端数组数据 并展示

目录 1 vue加依赖 --> 终端中install 2 main.js 引入依赖 3 components -> 组件中 如 HelloWorld.vue 中 3.1 中定义数组 并接收数据赋值给数组 3.2 el表格 接收数据数据 并展示出来 4 效果 1 vue加依赖 --> 终端中install npm i axios vue-axiosnpm i element…

Cesium教程(一):Cesium的下载和安装

目录 1、Cesium简介 2、Cesium下载和安装 2.1 下载方式1 2.2 下载方式2 3、Cesium测试 4、我的第一个Ceisum程序《HelloCesium》 1、Cesium简介 首先进入Cesium官网 Cesium 是 3D 地理空间平台Cesium 是软件应用程序的开放平台&#xff0c;旨在释放 3D 数据的力量。用于…

RocketMQ的安装讲解详细手册--------以及启动Broker启动找不到类问题

RocketMQ的安装 1.RocketMQ安装 1.1下载RocKetMQ 下载地址&#xff1a;https://rocketmq.apache.org/release-notes/2017/12/13/4.2.0 下载解压后 bin:可执行文件目录 confidence&#xff1a;配置文件目录 lib:依赖库&#xff0c;是一些jar包 1.1配置ROCKETMQ_HOME 解压…

前端工程化配置

前端工程化配置指南 如何构建一个工程化的前端库&#xff0c;并结合 Github Actions&#xff0c;自动发布到 Github 和 NPM 的整个详细流程。 示例 我们经常看到像 Vue、React 这些流行的开源项目有很多配置文件&#xff0c;他们是干什么用的&#xff1f;他们的 Commit、Releas…

如何利用Jmeter从0到1做一次完整的压测

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压测…

Selenium自动化测试设计模式 —— PO模式

前言&#xff1a; 在python自动化过程中&#xff0c;Selenium自动化测试中有一个名字常常被提及PageObject&#xff08;思想与面向对象的特性相同&#xff09;&#xff0c;通过PO模式可以大大提高测试用例的维护效率。 不了解po设计模式的可自行百度 面向对象的特性&#xf…

Class 05 - 逻辑运算符and,or,not 和 条件语句 if

Class 05 - 逻辑运算符and,or,not 和 条件语句 if 逻辑运算符和条件语句逻辑运算符 and , or , notand 运算符“&”OR 运算符 “|”not 运算符“&#xff01; 案例运用 and , or , notsubset() 筛选数据AND 实例OR 实例NOT 实例混合使用实例 条件语句 ifif 语句else语句els…

五分钟搞懂Web UI自动化测试中的POM设计模式。

今天&#xff0c;我们来聊聊Web UI自动化测试中的POM设计模式。 为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举栗&#xff09;&#xff1a; 使用以上代码&#xff0c;最基础最…

RabbitMQ五种消息模型

文章目录 1.简单消息队列模型2.Work工作队列模型3.发布订阅模型3.1.Fanout广播3.2.Direct路由3.3.Topics通配符 RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型&#xff0c;只不过进行路由的方式不同。 1.简单消息队列模型 简单消息队…

Midjourney提示词资源、使用技巧、艺术家资源网站收录

为了帮助艺术家们使用Midjourney更专业、准确地创作更完美的艺术作品&#xff0c;我们收录了一些Midjourney提示词资源分享、提示词书写技巧、相关专业工具&#xff0c;同时还有一些相关艺术家资源帮艺术家们找到创作灵感。有很多是社区内资深玩家分享的云文档&#xff0c;资源…

【机器视觉3】双目立体视觉模型

双目立体视觉模型 简单模型一般模型 简单模型 假设两个摄像机平行放置于同一高度、光轴平行、成像平面重合、焦距相同、左右图像每一行y坐标方向、大小相同&#xff0c;如下图所示&#xff1a; 由左右成像平面上的点、目标物点、焦距、摄像机中心基线距离的几何关系可以得到&…

MySQL学习指南笔记经典案例句

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 该文章是一篇关于MySQL的一个学习的笔记或是指南&#xff0c;该文章中有很多的经典的案例可进行相应的练习和参考&#xff0c;后期的话会持续更新关于数据库系统方面的文章。 MySQL学…

供应商评估:关键标准以及如何执行

几乎每个行业的企业都与制造商、进口商、服务提供商和分销商等供应商合作。由于通常有几个供应商可供选择&#xff0c;进行供应商评估有助于企业选出其中最符合其业务需求的供应商。 什么是供应商评估&#xff1f; 供应商评估是企业在为其产品或材料选择供应商时使用的过程。…

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…

iOS swift5 获取系统或其他app已经连接的蓝牙设备

文章目录 chatGPT答案1.2 retrievePeripheralsWithIdentifiers 本人实例参考博客 chatGPT答案 1.1 retrieveConnectedPeripherals(withServices (本人没有测试成功) 要获取系统或其他app已连接的蓝牙设备&#xff0c;你可以使用CoreBluetooth框架提供的CBCentralManager类。下…

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

新人如何学习软件测试

零基础学习软件测试不失为一个好的选择&#xff0c;虽然IT行业里对小白最友好的非软件测试莫属了&#xff0c;但是也要看你个人在学习软件测试这件事上面花费了多少的时间和努力了~ 每年毕业季&#xff0c;IT行业依然是比较热门且收入是最高的行业。对于应届毕业生来说想要进入…

Unity3d 开发Pico4应用打开工程卡在Importing(iteration xxx) busy for xx:xx)...问题记录

问题 大致问题如题&#xff1a; 步骤是参照了PICO官方给出的快速开始的步骤进行的&#xff0c;而这个我问题的出现是在导入 PICO Unity Integration SDK 前往 SDK 下载中心&#xff0c;下载最新版本的 SDK。 1.解压所下载的 SDK 压缩包。 2.你将会得到一个包含 package.json…

微服务圣经1:零基础搭建一套SpringCloud微服务脚手架(SpringCloud+Dubbo+Docker+Jenkins)

说在前面 在40岁老架构师尼恩的读者社群&#xff08;50&#xff09;中&#xff0c;大量的小伙伴是架构师、高级开发&#xff0c;大家都有丰富的开发、架构经验。 在开发过程中&#xff0c;一般情况下&#xff0c;大家都是用现有的开发框架。 导致的一个严重问题是&#xff1…

全网独家首发最牛最全面的JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a; 定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&am…