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

这篇具有很好参考价值的文章主要介绍了开发笔记之:文件读取值溢出bug分析(JAVA版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(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(单元测试)时,遇到了读取中断的问题(就是文件还没读取完就提前中断了)。以下是数据文件内容:
开发笔记之:文件读取值溢出bug分析(JAVA版)中断的原因就是返回值为约定的 -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)结论

数据文件读取溢出需关注的点:文章来源地址https://www.toymoban.com/news/detail-453887.html

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

到了这里,关于开发笔记之:文件读取值溢出bug分析(JAVA版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java流式下载大文件,避免OOM内存溢出】

    Java下载文件时,如果是小文件的下载,我们一般直接使用工具类的方法,比如cn.hutool.http.HttpUtil.downloadFile()。但是如果是大文件的下载,使用这些工具类的方法,可能会出现Out of Memory内存溢出,它是指需要的内存空间大于系统分配的内存空间,oom后果就是项目程序crash,Hpr

    2024年02月11日
    浏览(36)
  • Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output

    在加载 BCI Competition IV 2a 数据集时,当使用 mne 库的 io 的 read_raw_gdf() 函数时出错。注: 该代码只是按照正常途径读取GDF文件。 代码如下: 报错: 考虑到在网上找了众多关于 mne 库读取 gdf 文件的文章均没有出现该问题,同时网上找到的关于 该报错信息 的内容也均未出现上文

    2024年02月11日
    浏览(27)
  • 《深入理解Java虚拟机(第三版)》读书笔记:Java内存区域与内存溢出异常、垃圾收集器与内存分配策略

    下文是阅读《深入理解Java虚拟机(第3版)》这本书的读书笔记,如有侵权,请联系删除。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有

    2024年02月03日
    浏览(30)
  • JDBC MySQL任意文件读取分析

    文章首发于知识星球-赛博回忆录。给主管打个广告,嘿嘿。 在渗透测试中,有些发起mysql测试流程(或者说mysql探针)的地方,可能会存在漏洞。在连接测试的时候通过添加allowLoadLocalInfileInPath,allowLoadLocalInfile,allowUrlInLocalInfile与伪造的服务器进行通信,造成任意文件读取。 完整

    2024年02月07日
    浏览(29)
  • Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

    该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/pG623】 1. 添加测试依赖启动器和单元测试 修改pom.xml文件,添加依赖 刷新项目依赖 2. 创建测试类与测试方法 在 src/test/java 里创建 cn.kox.boot 包,创建测试类 TestHelloWorld01 给测试类添加测试启动器注解与Spring

    2024年02月10日
    浏览(36)
  • Java企业级开发学习笔记(4.4)Spring Boot加载自定义配置文件

    创建 Spring Boot 项目 单击【创建】按钮 在 resources 里创建 myconfig.properties 文件 设置文件编码 设置学生的四个属性值 在 cn.kox.boot 包里创建config子包,在子包里创建 StudentConfig 打开自带的测试类 ConfigDemo01ApplicationTests 注入学生配置实体,创建 testStudentConfig() 测试方法,在里面输

    2024年02月08日
    浏览(34)
  • java 逐行读取文件(读取文件每一行、按行读取文件)附带示例代码

    最快的读取每一行 相比较Scanner慢一点 行数达到一定规模,使用此方法读取会非常慢 一次把所有数据都读到内存中,当文件非常大时,会消耗掉内存资源导致程序崩掉,文件规模小推荐使用 统计每一行日志ip出现的次数

    2024年02月11日
    浏览(34)
  • .NET学习笔记----关于.NET Core那些事(3)【配置文件的读取、json文件的通用解析、读取静态文件】

    appsettings.json准备 控制器中读取json 定义与配置文件中需要获取的标签结构完全一致的实体类:IConfiguration .Bind() ----反序列化 要读取的json字符串 定义的实体类 读取json 用到的json字符串 == 用到的类 Startup.cs中的配置 控制器中的代码 运行结果 当我们用《关于.NET Core那些事(2)》

    2024年02月04日
    浏览(27)
  • 【JasperReports笔记01】Jasper Studio报表开发工具的安装以及使用Java填充模板文件内容

    这篇文章,主要介绍如何安装Jasper Studio报表开发工具以及使用Java填充模板文件内容。 目录 一、安装Jasper Studio工具 1.1、下载报表开发工具 1.2、工具界面介绍 (1)启动工具 (2)创建项目 二、制作Jasper模板文件 2.1、Jasper文件组成区域介绍 2.2、制作模板文件 三、使用Java填

    2024年02月03日
    浏览(30)
  • python读取CSV文件表头字段乱序作json文件(自己笔记)

    🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:一晌小贪欢的博客主页 👍 该系列文章专栏:Python办公自动化专栏 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 ❤️ 欢迎各位佬关注! ❤️

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包