精华内容
下载资源
问答
  • 为了消除这些隐式的开销,如数组边界检查优化会尽可能地把运行期检查提前到编译器完成,或者隐式异常处理,如进程层面的异常处理器,只要数组不为空,就不会有额外的判空开销,但是一旦数组为空,则需要转到异常...

    本文章由公号【开发小鸽】发布!欢迎关注!!!


    老规矩–妹妹镇楼:

    一. 编译器优化技术

    (一) 概述

           编译器的目标是将程序代码翻译为本地机器码,输出代码优化质量的高低是决定编译器优秀与否的关键,所有的优化手段都是建立在代码的中间表示或者是机器码之上的,而不是Java源码。

    (二) 方法内联

    1. 概述

           方法内联是编译器最重要的优化手段,因为除了消除方法调用的成本之外,它更重要的意义是为其他的优化手段建立良好的基础。它的优化目的是将目标方法的代码原封不动地复制到发起调用地方法之中,避免发生真实的方法调用。


    2. Java的方法内联

           由于Java的默认实例方法是虚方法,需要在运行时进行方法接收者的多态选择,可能存在多于一个版本的方法接收者,只有是哦也能够invokespecial指令调用的私有方法,实例构造器,父类方法和使用invokestatic指令调用的静态方法才会在编译器进行解析。

           对于虚方法,编译器静态地做内联很难确定应该使用哪个方法版本,为了解决虚方法和内联的矛盾,Java虚拟机引入了类型继承关系分析(CHA),用于确定在目前已经加载的类中,某个接口是否有多于一种的实现,某个类是否存在子类,某个子类是否覆盖了父类的某个虚方法等。这样,编译器在进行内联时会根据不同情况进行处理,如果时非虚方法,则直接内联;如果是虚方法,则向CHA查询该方法在当前状态下是否有多个方法版本,如果只有一个版本,就以当前的方法进行内联,这成为守护内联,不过由于Java是动态连接的,可能随时加载到新的类型改变CHA的结论,因此需要给这个内联留逃生门,当出现新的加载类时,必须抛弃已经编译的代码,退回到解释状态执行,或者重新编译。

           如果CHA查询出来有多个方法版本可供选择,则使用内联缓存来缩减方法调用的开销,在这种状态下方法调用真的发生了,但是比起直接查询虚方法更快一些,内联缓存是一个建立在目标方法正常入口之前的缓存,记录下方法接收者的版本信息,并且在每次进行方法调用时比较接收者的版本。如果以后每次调用的方法版本都相同,则就是一种单态内联缓存,通过该缓存,比不内联的非虚方法调用仅多了依次类型判断开销;如果方法接收者不一致,则退化成超多态内联缓存,开销相当于查找虚方法表进行方法分派。

    (三) 逃逸分析

    1. 原理

           逃逸分析不是直接优化代码的手段,而是为其他优化措施提供依据的分析技术,基本原理就是分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种成为方法逃逸;甚至可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸。从不逃逸,方法逃逸到线程逃逸,称为对象从低到高的不同逃逸程度。根据不同的逃逸程度,会对这个对象实例采取不同程度的优化。

    2. 栈上分配

           Java堆中的对象对于各个线程都是共享和可见的,堆上的对象无论是标记可回收对象还是内存回收,都会消耗大量资源。如果确定一个对象不会逃逸出线程之外,让对象在栈上分配内存,内存会随着栈帧的出栈而销毁,降低垃圾收集系统的压力,栈上分配支持方法逃逸,不支持线程逃逸。

    3. 标量替换

           若一个数据无法再继续分解,如Java虚拟机中的原始数据类型可以称为标量;相对地,可以继续分解地数据称为聚合量,Java中的对象就是聚合量,如果将一个Java对象拆散,根据程序访问的情况,将其用到的成员变量恢复为原始类型来访问,这个过程就是标量替换。

           加入逃逸分析能够证明一个对象不会被方法外部访问,并且这个对象可以拆散,则程序真正执行时可能不去创建这个对象,而是直接创建它的若干个被这个方法使用的成员变量来代替,这些成员变量可以分配再栈上,也可以为后续的优化手段创造条件。标量替换不允许对象逃逸出方法范围内,即方法逃逸。

    4. 同步消除

           如果逃逸分析确定一个变量不会逃逸出线程,无法被其他线程访问,则这个变量的读写不会有竞争,则同步措施可以安全地消除。

    (四) 公共子表达式消除

           如果一个表达式已经被计算过了,并且值一直没有变化,则该表达式这次地出现称为公共子表达式,直接使用原来地值即可。如果这种优化限于程序基本块内,称为局部公共子表达式消除;如果优化的范围涵盖多个基本块,则称为全局公共子表达式消除。


    (五) 数组边界检查消除

           Java语言中会对数组的上下界进行范围检查,否则会抛出一个运行时异常,对于程序员十分友好,避免了溢出攻击。但是对于虚拟机的执行子系统来说,每次数组元素的读写都带有一次隐含的条件判定操作,这是一种性能负担。

           Java的各种安全检查,如数组越界,空指针访问,除数为0等都会有异常检查,这些检查会包含有隐式的开销。为了消除这些隐式的开销,如数组边界检查优化会尽可能地把运行期检查提前到编译器完成,或者隐式异常处理,如进程层面的异常处理器,只要数组不为空,就不会有额外的判空开销,但是一旦数组为空,则需要转到异常处理器中,速度比一次判空检查慢多了。型号,HotSpot虚拟机会根据运行期收集的性能监控信息自动选择合适的方案。

    展开全文
  • 链表边界检查

    2021-06-04 14:43:51
    为了保证链表处理正确,需要考虑其边界条件: 1、空链表的处理情况 2、只有一个结点的情况 3、只有两个结点的情况 4、头结点、wei

    为了保证链表处理正确,需要考虑其边界条件的处理:

    1、空链表的情况

    2、只有一个结点的情况

    3、只有两个结点的情况

    4、头结点、尾结点的情况

    5、除了以上边界外,还要根据业务处理的特殊边界

    展开全文
  • 本发明涉及智能卡技术领域,尤其涉及一种JAVA卡帧的边界检查方法。背景技术:随着电子政务和电子商务的发展,Java卡的应用越来越广泛,为解决用户对一卡多用的需要,目前多应用的Java卡越来越普遍,而应用之间的安全...

    0726ee722d26ceb91ef947c45e8a68e1.gif

    本发明涉及智能卡技术领域,尤其涉及一种JAVA卡帧的边界检查方法。

    背景技术:

    随着电子政务和电子商务的发展,Java卡的应用越来越广泛,为解决用户对一卡多用的需要,目前多应用的Java卡越来越普遍,而应用之间的安全问题也日益重要。

    现有的攻击手段中可通过激光攻击java卡的存储介质或者下载恶意Applet应用等方式,修改java方法的局部变量索引或者增减弹栈压栈操作,对方法帧的操作数栈和局部变量区进行越界访问,非法获取卡的存储数据。Java卡需要提供一种帧的边界检查方法,识别针对Java虚拟机的越界访问,即保证应用不能访问权限之外的栈数据。

    技术实现要素:

    为了解决Java卡平台现有技术中存在的上述问题,本发明提供了一种JAVA卡帧的边界检查方法。

    本发明采取的技术方案如下:

    一种JAVA卡帧的边界检查方法,包括如下步骤:

    步骤S1:Java卡虚拟机执行应用的Java方法时,建立一个方法帧,并压入栈,记录方法帧的起始地址。同时记录两个范围:合法操作数范围和合法局部变量索引范围。

    步骤S2:所述Java卡虚拟机执行所述所述Java方法的字节码时如需访问栈数据,获取需要访问的栈数据类型。

    步骤S3:根据所述数据类型;如果当前操作数据是局部变量,则执行步骤A1;如果当前操作数据是操作数,则执行步骤B1。

    步骤A1:判断局部变量索引是否在合法局部变量索引范围内,是则执行步骤S4,否则抛出异常。

    步骤B1:判断操作数地址是否在合法操作数范围内,是则执行步骤S4,否则抛出异常。

    步骤S4:Java卡虚拟机执行当前字节码。

    进一步的,所述的记录两个范围,其特征是:所述Java卡虚拟机解析所述应用的Java方法的method_header_info数据结构中的max_stack,max_locals,nargs信息结合所述方法帧的起始地址信息。使用0作为合法局部变量索引范围的下边界;使用方法帧下边界加上(max_locals+nargs-1)作为合法局部变量索引范围的上边界;使用方法帧起始地址+((max_locals+nargs)*2)作为合法操作数范围的下边界;使用合法操作数范围的下边界加上(max_stack*2)作为合法操作数范围的上边界。

    本发明的有益效果在于:本发明实现了Java卡的多应用安全管理,尤其是通过边界检查的方法控制栈帧数据的访问,提高了多应用共存的安全性。

    附图说明

    图1是一个Java方法在java卡虚拟机上的执行流程图。

    图2是合法操作数范围和合法局部变量索引范围的位置示意图。

    图3是以sstore_2字节码为示例的执行流程图。

    具体实施方式

    下面将结合附图和具体实施例对本发明做进一步的说明。

    图1指出了一个java方法在java卡虚拟机上的执行流程。Java卡虚拟机执行该方法时,会为其建立一个方法帧,并压入栈,记录方法帧的起始地址。同时记录两个范围:合法操作数范围和合法局部变量索引范围。然后依次执行java方法中的字节码。直至java方法执行结束,方法帧弹出栈。

    图2指出了合法操作数范围和合法局部变量索引范围的位置示意图。从方法帧的起始地址开始,是局部变量区。因此合法局部变量范围为方法帧起始地址到((max_locals+nargs)*2)。则合法局部变量索引范围为0到(max_locals+nargs-1)。局部变量区上方是操作数区。因此合法操作数范围为(方法帧起始地址+((max_locals+nargs)*2))到(方法帧起始地址+(max_locals+nargs)*2+max_stack*2)。

    图3是上述Java方法中sstore_2字节码的执行流程图。检查字节码所要写入索引为2的局部变量是否在合法局部变量索引范围内,在则继续执行,不在则抛出异常结束。从帧中将两个字节数据弹栈,并将帧顶指针减2存储。检查帧顶指针是否在合法操作数范围内,在则继续执行,不在则抛出异常结束。将两个字节数据写入到局部变量中。

    显然,本领域的技术人员可以对本发明进行各种改动和变形而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变形属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

    展开全文
  • c++primer里的一道题int *a;...能检测边界的只有这种 int(&a)[10]。#includeusing std::cin;using std::cout;using std::endl;int Sum1(int *begin,int *end){int sum=0;while(begin!=end){s...

    c++primer里的一道题

    int *a;

    int a[];

    int a[10];

    三种形参都一样,都被认为是int *a。

    能检测边界的只有这种 int(&a)[10]。

    #include

    using std::cin;

    using std::cout;

    using std::endl;

    int Sum1(int *begin,int *end)

    {

    int sum=0;

    while(begin!=end)

    {

    sum+=*begin;

    ++begin;

    }

    return sum;

    }

    int Sum2(int a[],size_t l)

    {

    int sum;

    for(size_t i=0;i!=l;i++)

    {

    sum+=*a;

    a++;

    }

    return sum;

    }

    int Sum3(int (&a)[10],int i)//这种形参传递了数组的大小

    {

    int sum=0;

    int index=0;

    while(a[index]<=i)

    {

    cout<

    cout<

    sum+=a[index];

    cout<

    ++index;

    if(index==10)

    {

    break;

    }

    cout<

    }

    return sum;

    }

    int main ()

    {

    const size_t length=10;

    int a[length]={1,2,3,4,5,6,7,8,9,10};

    cout<

    cout<

    cout<

    return 0;

    }

    展开全文
  • 最近,我们在Visual Studio v16.10 Preview 3中添加了一项新的实验...这两项分析规则会对容器的未经检查的访问发出警告:”Prefer to use gsl::at() instead of unchecked subscript operator (bounds.4).” 新的警告会
  • 当我们使用异常来执行边界检查时会发生什么?使用异常处理诸如空检查,边界检查,文件存在检查等操作时,每当抛出异常时都会引入大量开销.如果您只是检查边界,您会做什么:>检查数组的大小是否为0,反对>返回结果...
  • java.util.Arrays在对double[]数组排序的源码,调用sort2(double[],int,int),具体如下:private static void sort2(double a[], int fromIndex, int toIndex) {final long NEG_ZERO_BITS = Double.doubleToLongBits...
  • 1.必要性: 1.由于请求异步执行的原因,当还未获取到对象某个键时,在vue中,data中声明的是{}或者是null、undefined 2.实际代码: 1.关于布尔值的判断 // 为0为空字符串为null为undefined都是false ...
  • 我在其中收到OutofBounds错误。 出站发生在“ if(arr [j] == arr [i])”处,程序找到了重复的数字并将其设为0。然后将所有这些重复的数字向左移动。input: {10,20,4,20,5}output:{0,0,10,4,5}码:import java.util.*...
  • 任何在肿瘤上的点 , 如果它是图像的边界或者它的上下左右四个相邻点中至少有一个是非肿瘤上的点, 则该点称为肿瘤的边界点。肿瘤的边界点的个数称为肿瘤的周长。 现在给定一个图像, 要求计算其中的肿瘤的面积和...
  • 目录一、公共子表达式消除二、数组边界检查消除三、隐式异常处理四、方法内联五、逃逸分析六、Java与C/C++的编译器对比 一、公共子表达式消除   如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量...
  • 但at()是我们的首选,因为: at()总是做边界检查,下标运算符(operator[] )不做边界检查。 解析(详情参看 《C++ Primer》(第5版) P310 ”下标操作和安全的随机访问“):   提供快速随机访问的容器(如:string...
  • 内存变量边界对齐

    2020-12-24 11:43:55
    一、什么是内存对齐(1) 原理a) 编译器按照成员列表的顺序给每个成员分配内存.b) 当成员需要满足正确的边界对齐时,成员之间用额外字节填充.c) 结构体的首地址必须满足结构体中边界要求最为严格的数据类型所要求的地址...
  • c语言对数组不进行边界检查,可能会导致,数组越界访问,导致存储越界,将数组的数据写入其他缓冲区。导致数据丢失、错误。 出现问题的原因: 图片来源https://blog.csdn.net/snowq/article/details/1749087 栈的...
  • C语言结构体边界对齐

    2021-05-22 16:58:35
    成员e是4个字节,它是默认按4字节对齐,和指定的一样,所以它对到4字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第12个字节开始放置成员e.这时,长度为16,已经可以被4(成员e按4字节对齐)整除.这样...
  • 我有以下想法: >开始检查日期值等于我的dateFrom参数的元素上的小时的最小值,并检查该值是否等于hourFrom.对于hourTo执行相似操作,但使用Date的值等于dateTo参数值的那些行的最大值. >按日期和小时对我的测试方法中...
  • 系列文章目录这个学期我们进行学习了... 请使较为简单的代码确定你机器的存储模式是大端模式还是小端模式(默认使用C语言)三、关于边界对齐总结前言我以前写了这么多的代码,学到这里,才发现原来在内存中还有大...
  • 标题:结构的存储分配结构,对于其列表中的成员,在内存分配时,要求边界对齐。也就是说,如果某个机器的整型值长度为四个字节,并且它的内存地址必须能够被4整除,那么它在内存中存放状态就是有条件的,它不能任意...
  • 软件测试Correct边界条件 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分Correct边界条件代码中的许多Bug都出现在“边界条件”附近,也就是说,在那些条件...
  • 在Fluent中采用TUI设置周期性边界的方法By Zjz(1)首先,指定计算域的Rotational Axis(Cell Zone Conditions中,Frame Motion)(2)其次,对响应的组件进行周期性设置,命令为:/mesh/modify-zones> make-...
  • 边界值分析法实例

    2021-07-29 07:57:48
    边界值分析法实例发表于:2011-12-21来源:未知作者:娃娃点击数:实例: “某一为学生考试试卷评分和成绩统计的程序,其规格说明指出了对程序的要求: 程序的输入文件由80个字符的一些记录组成,这些记录分为三组:...
  • 等保测评之安全区域边界

    千次阅读 2021-02-20 17:13:54
    安全区域边界 1. 边界防护 a)应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信; 1)应核查网络拓扑图与实际的网络链路是否一致,是否明确了网络边界,且明确边界设备端口。 2)应核查路由配置信息及...
  • 一、使用上边界通配符示例、 二、分析字节码的附加信息
  • 模型的边界条件包括:表面边界条件和侧边界条件 表面边界条件分为表面温度边界条件和表面风强迫边界条件(风应力以及动量通量) 流场数据座位开边界流场的输入条件
  • 测试用例设计方法---边界值分析法 边界值分析法学习目标 掌握边界值分析法设计测试用例 掌握边界值分析法取值范围的确定 掌握离点的划分方法 1、为什么要学习边界值分析法案例:两位数加法计算器 要求:输入两...
  • 中国振动联盟标题:在fluent中修改周期性边界条件,怎么不对啊[打印本页]作者:skgk-qqq时间:2012-2-2609:39标题:在fluent中修改周期性边界条件,怎么不对啊我是在fluent主界面输入命令:gridmodcheck,然后回车,得到...
  • 边界匹配者

    2021-04-24 17:04:23
    # 边界匹配者到目前为止,我们只对某个特定输入字符串中的某个位置是否发现匹配感兴趣。我们从来不关心匹配发生在字符的哪里。您可以通过使用边界匹配器指定这些信息来使您的模式匹配更精确。例如,也许你有兴趣找到...
  • multipart / form-data包含分隔名称/值对的边界边界的作用类似于提交表单时传递的每个名称/值对的标记。边界自动添加到请求标头的内容类型。具有enctype =“multipart / form-data”属性的表单将具有请求标头...
  • 缓冲区溢出漏洞

    2021-01-19 09:37:23
    缓冲区溢出就是在大缓冲区数据向小缓冲区复制的过程中,由于没有注意到小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。缓冲区溢出是常见的内存错误之一,...
  • 周期性边界是分子动力学模拟中常用的一种技术手段,不仅可以完整的概述完整的分子体系的特性,在一部分场景下还可以提升计算的效率,从作用上来看更像是一类的近似模型(假设有一个原子逃出这个周期性边界封装的盒子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,905
精华内容 75,162
关键字:

边界检查