发明内容
为解决上述问题,本发明提出了一种调用指令的优化方法、装置、设备和存储介质,如此,便于基于确定出的开始位置和/或结束位置对目标调用指令进行优化处理,为最大化优化调用指令奠定了基础。
第一方面,本申请实施例提供一种调用指令的优化方法,包括:
确定出目标调用指令,以及目标调用指令所对应的目标指令描述特征,所述目标指令描述特征至少表征运行目标调用指令所需参数的第一参数特征,以及所需返回值的第二参数特征;其中,所述目标调用指令在运行过程中能够基于第一参数特征从操作数栈中读取所需参数,以及基于第二参数特征将所需输出的返回值存入所述操作数栈;
检测目标调用指令在运行过程中所述操作数栈的栈存储状态的变化特征;
基于运行目标调用指令所需参数的第一参数特征和所需返回值的第二参数特征,以及所述操作数栈的栈存储状态的变化特征确定出目标调用指令运行的开始位置和/或结束位置,其中,基于确定出的开始位置和/或结束位置能够完成对目标调用指令的优化处理。
这里,由于本申请方案能够确定出目标调用指令所需参数以及所需返回值的参数特征,且在目标调用指令的运行过程中操作数栈的栈存储状态会随着所需参数和/或返回值的出栈、进栈而变化,所以,基于此,本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,如此,便于基于开始位置和/或结束位置对目标调用指令进行优化处理,为最大化优化调用指令奠定了基础。
而且,由于本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,所以,与现有仅能优化一条调用指令的方法相比,本申请方案能够优化目标调用指令所运行的全部程序,且该全部程序中既能够包含调用指令所对应的全部指令(如参数构造指令等),也能够包含目标调用指令所生成的相关数据和/或目标调用指令所对应的其他调用指令所生成的相关数据,如此,进一步为最大化优化调用指令奠定了基础,为降低线上程序的包体积奠定了基础,同时,也为提高线上程序的运行效率,以及程序安全性奠定了基础。
在一具体实施例中,所述检测目标调用指令在运行过程中所述操作数栈的栈存储状态的变化特征,包括:
获取目标调用指令运行前所述操作数栈的第一栈存储状态特征;
检测目标调用指令在运行过程中所述操作数栈的第二栈存储状态特征;
基于第一栈存储状态特征以及第二栈存储状态特征确定出操作数栈的栈存储状态的变化特征。
在一具体实施例中,在目标调用指令开始运行前以及结束运行后,所述操作数栈的栈存储状态不变。
这里,本申请方案能够利用目标调用指令分别在运行前以及运行过程中操作数栈的栈存储状态特征来确定运行过程中的变化特征,进而为确定出目标调用指令运行的开始位置和/或结束位置奠定了基础,且该方案简单可行,为后续工程化应用奠定了基础。
在一具体实施例中,确定出目标调用指令运行的开始位置的步骤包括:
基于第一参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需参数存入所述操作数栈的执行代码所在位置;
从目标调用指令所需参数存入所述操作数栈的执行代码所在位置中,选取出首次将目标调用指令所需参数存入所述操作数栈的执行代码所在位置作为开始位置。
这里,实际应用中,由于在目标调用指令运行过程中会向操作数栈事先存入所需参数,然后在运行过程中读取事先存入的参数,以确保目标调用指令的正常运行,所以,基于上述流程,本申请实施例能够基于事先存入操作数栈的参数的执行代码所在位置,来确定目标调用指令的开始位置,即锁定首次将目标调用指令所需参入存入操作数栈的位置来作为开始位置,如此,来为最大化优化调用指令奠定基础,而且,由于本申请实施例提供了确定开始位置的具体可行解决方案,所以,为后续工程化应用奠定了基础。
在一具体实施例中,确定出目标调用指令运行的结束位置的步骤包括:
基于第二参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需输出的返回值存入所述操作数栈之后,移出所述操作数栈的执行代码所在位置;
从移出所述操作数栈的执行代码所在位置中,选取出末次将目标调用指令所需输出的返回值移出所述操作数栈后的执行代码所在位置作为结束位置。
这里,实际应用中,由于在目标调用指令运行过程中会向操作数栈存入所需输出的返回值,然后在运行结束前移除,所以,基于上述流程,本申请实施例能够基于存入操作数栈的返回值后又移出所述操作数栈的执行代码所在位置,来确定目标调用指令的结束位置,即锁定末次将目标调用指令所需输出的返回值移出所述操作数栈的执行代码所在位置来作为结束位置,如此,来为最大化优化调用指令奠定基础,而且,由于本申请实施例提供了确定结束位置的具体可行解决方案,所以,为后续工程化应用奠定了基础。
在一具体实施例中,所述确定出目标调用指令,包括:
检测到调用指令,判断调用指令的指令描述特征所表征的函数是否为待检测函数;若是,将调用指令作为目标调用指令;或者,
确定出待检测函数,将待检测函数所对应的调用指令作为目标调用指令。
这里,这里,为满足实际需求,扩大应用范围,丰富应用场景,本申请方案可以扩展为对程序中函数对应的调用指令进行优化,比如,在检测得到调用指令后,判断该调用指令所对应的函数是否为待检测函数,进而来确定是否进行优化,如对待检测函数的调用指令进行优化;或者,先确定待检测函数,然后,对待检测函数中的调用指令进行优化,这样,将本申请方案应用到开发场景中,丰富了应用场景,为降低线上程序的包体积奠定了基础,同时,也为提高线上程序的运行效率,以及程序安全性奠定了基础。
第二方面,本申请实施例提供一种调用指令的优化装置,包括:
检测单元,用于确定出目标调用指令,以及目标调用指令所对应的目标指令描述特征,所述目标指令描述特征至少表征运行目标调用指令所需参数的第一参数特征,以及所需返回值的第二参数特征;其中,所述目标调用指令在运行过程中能够基于第一参数特征从操作数栈中读取所需参数,以及基于第二参数特征将所需输出的返回值存入所述操作数栈;检测目标调用指令在运行过程中所述操作数栈的栈存储状态的变化特征;
处理单元,用于基于运行目标调用指令所需参数的第一参数特征和所需返回值的第二参数特征,以及所述操作数栈的栈存储状态的变化特征确定出目标调用指令运行的开始位置和/或结束位置,其中,基于确定出的开始位置和/或结束位置能够完成对目标调用指令的优化处理。
在一具体实施例中,所述检测单元,还用于:
获取目标调用指令运行前所述操作数栈的第一栈存储状态特征;
检测目标调用指令在运行过程中所述操作数栈的第二栈存储状态特征;
基于第一栈存储状态特征以及第二栈存储状态特征确定出操作数栈的栈存储状态的变化特征。
在一具体实施例中,所述处理单元,还用于:
基于第一参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需参数存入所述操作数栈的执行代码所在位置;
从目标调用指令所需参数存入所述操作数栈的执行代码所在位置中,选取出首次将目标调用指令所需参数存入所述操作数栈的执行代码所在位置作为开始位置。
在一具体实施例中,所述处理单元,还用于:
基于第二参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需输出的返回值存入所述操作数栈之后,移出所述操作数栈的执行代码所在位置;
从移出所述操作数栈的执行代码所在位置中,选取出末次将目标调用指令所需输出的返回值移出所述操作数栈后的执行代码所在位置作为结束位置。
在一具体实施例中,所述检测单元,用于:
检测到调用指令,判断调用指令的指令描述特征所表征的函数是否为待检测函数;若是,将调用指令作为目标调用指令;或者,
确定出待检测函数,将待检测函数所对应的调用指令作为目标调用指令。
第三方面,本申请实施例提供一种调用指令的优化设备,包括:
一个或多个处理器;
与所述一个或多个处理器通信连接的存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序被配置为执行以上所述的方法。
第四方面,本申请实施例提供一种计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现以上所述的方法。
这样,由于本申请方案能够确定出目标调用指令所需参数以及所需返回值的参数特征,且在目标调用指令的运行过程中操作数栈的栈存储状态会随着所需参数和/或返回值的出栈、进栈而变化,所以,基于此,本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,如此,便于基于开始位置和/或结束位置对目标调用指令进行优化处理,为最大化优化调用指令奠定了基础。
而且,由于本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,所以,与现有仅能优化一条调用指令的方法相比,本申请方案能够优化目标调用指令所运行的全部程序,且该全部程序中既能够包含调用指令所对应的全部指令(如参数构造指令等),也能够包含目标调用指令所生成的相关数据和/或目标调用指令所对应的其他调用指令所生成的相关数据,如此,进一步为最大化优化调用指令奠定了基础,为降低线上程序的包体积奠定了基础,同时,也为提高线上程序的运行效率,以及程序安全性奠定了基础。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在本申请的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
针对现有技术问题,本申请方案能够确定出调用指令的开始位置以及结束位置,进而能够在删除调用指令的同时,将程序中调用指令及其运行该调用指令的其他指令和相关数据(个数不定、复杂程度不定)进行优化,实现将完整的调用指令进行全部优化,如全部删除的目的。
具体地,图1为本发明实施例调用指令的优化方法的实现流程示意图,如图1所示,所述方法包括:
步骤101:确定出目标调用指令,以及目标调用指令所对应的目标指令描述特征,所述目标指令描述特征至少表征运行目标调用指令所需参数的第一参数特征,以及所需返回值的第二参数特征;其中,所述目标调用指令在运行过程中能够基于第一参数特征从操作数栈中读取所需参数,以及基于第二参数特征将所需输出的返回值存入所述操作数栈。
本实施例中,第一参数特征可以具体包括参数的数量,以及参数描述信息等;相应地,第二参数特征可以具体包括返回值的数量,以及返回值的参数描述信息等,当然,实际应用中,参数特征中还可以包含其他特征信息,本申请实施例对此不作限制。
实际应用中,目标调用指令所需参数可以通过参数构造指令,参数指令等实现,相应地,所需返回值也可以通过参数构建指令,返回值指令实现;这里,由于本申请方案能够定位到目标调用指令执行的开始位置以及结束位置,进而能够基于开始位置和结束位置对整个目标调用指令进行优化,所以,本申请方案中无需关注目标调用指令中具体所包含的其他指令,以及运行过程中所生成的相关数据,只需获知该目标调用指令所需参数以及所需返回值进而确定出该目标调用指令的开始位置和结束位置即可。
这里,在实际应用中,以java为例,一条完整java方法(也即函数)中的调用指令会被编译成一个或多个连续字节码指令,也就是说,一个调用指令会编译成一个或多个其他指令,且调用指令及调用指令所编译成的其他指令是基于堆栈来实现的(比如,调用指令所需参数或返回值是通过操作数栈来实现的),每一个指令对应操作数栈的若干次出栈和入栈;但在一个完整独立代码/代码块(比如调用指令)执行前和执行后操作数栈是一样的,换言之,一个完整独立代码/代码块(比如调用指令)在运行前和运行后,操作数栈的栈存储状态不变。
这里,可以通过下述假设来论证调用指令运行前和运行后操作数栈的栈存储状态不变,具体地,
假设一:在一个完整独立代码/代码块(比如调用指令)执行前比执行后操作数栈变多,那么,若重复多份这样的独立代码/代码块(比如在for循环中重复),则操作数栈一定会出现栈溢出导致崩溃情况;因此,假设一不成立。
假设二:假设在一个完整独立代码/代码块(比如调用指令)执行前比执行后操作数栈变少,那么,若重复多份这样的独立代码/代码块(比如在for循环中重复),则操作数栈一定会出现栈变成负数而导致崩溃的情况;因此,假设二不成立。
基于上述假设,可以验证得到一个完整独立代码/代码块(比如调用指令)在运行前和运行后,操作数栈的栈存储状态不变。基于此,本申请实施例给出确定调用指令的开始位置和/或结束位置的具体方案。
这里,在一具体示例中,可以针对函数的调用指令来进行优化,此时,可以采用如下两种方式实现,具体地,
方式一:检测到调用指令,判断调用指令的指令描述特征所表征的函数是否为待检测函数;若是,将调用指令作为目标调用指令;否则,不对调用指令进行处理;也就是说,该方式中,直接对调用指令进行筛选,且仅对待检测函数中的调用指令进行优化,如此,为利用本申请方案对开发程序进行优化奠定了基础,进而为后续工程化应用也奠定了基础。
方式二:确定出待检测函数,将待检测函数所对应的调用指令作为目标调用指令。也就是说,该方式中,先对函数进行筛选,筛选出待检测函数,然后对待检测函数中的调用指令进行优化,如此,同样能够实现对开发程序进行优化的目的。
本示例给出了两种可行方案,且该两种可行方案可以根据实际场景的复杂情况而选择,如此,进一步扩大了本申请方案的应用范围,同时,为工程化应用奠定了基础。需要注意的是,实际应用中,上述两种方式可以择一而执行,本申请实施例对此不作限制。
步骤102:检测目标调用指令在运行过程中所述操作数栈的栈存储状态的变化特征。
本实施例中,栈存储状态特征(如第一栈存储状态特征或第二栈存储状态特征)可以具体指入栈和/或出栈的参数(或返回值)的变化特征(如数量变化等),如此,便于后续基于栈存储状态来确定出目标调用指令运行的开始位置和结束位置。
在一具体示例中,可以采用如下方式确定出操作数栈的栈存储状态的变化特征,步骤包括:获取目标调用指令运行前所述操作数栈的第一栈存储状态特征;检测目标调用指令在运行过程中所述操作数栈的第二栈存储状态特征;基于第一栈存储状态特征以及第二栈存储状态特征确定出操作数栈的栈存储状态的变化特征。比如,对比第二栈存储状态特征,与第一栈存储状态特征中参数的数量或者参数描述信息等即可确定运行前和运行过程中栈存储状态的变化。这里,实际应用中,在目标调用指令开始运行前以及结束运行后,所述操作数栈的栈存储状态不变。如此,基于在运行前以及运行过程中栈存储状态的变化特征,以及运行前和运行后栈存储状态不变的特点即可确定出目标调用指令运行的开始位置和/或结束位置。
步骤103:基于运行目标调用指令所需参数的第一参数特征和所需返回值的第二参数特征,以及所述操作数栈的栈存储状态的变化特征确定出目标调用指令运行的开始位置和/或结束位置,其中,基于确定出的开始位置和/或结束位置能够完成对目标调用指令的优化处理。
这样,在确定出开始位置和结束位置后,即可删除开始位置至结束位置所对应的程序,以完成对目标调用指令的优化处理,且该处理彻底,无遗留。
在一具体实施例中,确定出目标调用指令运行的开始位置的步骤包括:基于第一参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需参数存入(也即入栈)所述操作数栈的执行代码所在位置;从目标调用指令所需参数存入(也即入栈)所述操作数栈的执行代码所在位置中,选取出首次将目标调用指令所需参数存入(也即入栈)所述操作数栈的执行代码所在位置作为开始位置。也就是说,目标调用指令的开始位置是对应该目标调用指令所需参数的第一个入操作数栈的参数对应的代码程序(也可为指令)所在位置。
在另一具体实施例中,确定出目标调用指令运行的结束位置的步骤包括:基于第二参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需输出的返回值存入(也即入栈)所述操作数栈之后,移出(也即出栈)所述操作数栈的执行代码所在位置;从移出(也即出栈)所述操作数栈的执行代码所在位置中,选取出末次将目标调用指令所需输出的返回值移出(也即出栈)所述操作数栈后的执行代码所在位置(也即最后一个返回值出栈的执行代码所在位置)作为结束位置。也就是说,目标调用指令的结束位置是对应该目标调用指令所需的返回值中最后一个出操作数栈的返回值对应的代码程序所在位置。
这样,由于本申请方案能够确定出目标调用指令所需参数以及所需返回值的参数特征,且在目标调用指令的运行过程中操作数栈的栈存储状态会随着所需参数和/或返回值的出栈、进栈而变化,所以,基于此,本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,如此,便于基于开始位置和/或结束位置对目标调用指令进行优化处理,为最大化优化调用指令奠定了基础。
而且,由于本申请方案能够确定出目标调用指令运行的开始位置和/或结束位置,所以,与现有仅能优化一条调用指令的方法相比,本申请方案能够在编译期间优化目标调用指令所运行的全部程序,且该全部程序中既能够包含调用指令所对应的全部指令(如参数构造指令等),也能够包含目标调用指令所生成的相关数据和/或目标调用指令所对应的其他调用指令所生成的相关数据,如此,进一步为最大化优化调用指令奠定了基础,为降低线上程序的包体积奠定了基础,同时,也为提高线上程序的运行效率,以及程序安全性奠定了基础。
通过上述方案描述,总结得到本申请方案原理:查找方法(也即函数)调用指令的开始位置和结束位置,将调用指令关联的一段代码(即从开始位置至结束位置所对应的一段代码)删除;其中,查找思路为:
调用指令的开始位置是对应该调用指令所需参数的第一个入操作数栈的参数所对应的代码程序(也可为指令)所在位置;调用指令的结束位置是对应该调用指令所需的返回值中最后一个出操作数栈的返回值所对应的代码程序所在位置。
需要说明的是,调用指令所需的输出的返回值会先入操作数栈,然后再出栈,而结束位置是根据最后一个出操作数栈的返回值对应的代码程序所在位置而确定的,在一示例中,比如java开发中,返回值可以通过pop指令出栈,若返回值不是被pop指令出栈的,则可说明返回值被方法中其他调用指令所使用了,为了确保优化的业务逻辑的正确性,可以对该种情况做跳过处理,也即不进行优化,所以,考虑到上述情况,实际应用中,调用指令的结束位置对应最后一个出栈的返回值对应的位置,比如最后一个被pop指令出栈的返回值对应的代码程序所在位置,或者返回值为空时的代码程序所在位置。
基于此,可以对所有代码进行全局扫描,然后找到待处理的调用指令(也即目标调用执行),对待处理的调用执行的参数进行向前查找,对返回值进行向后查找,逆向反推出该待处理的调用指令的开始位置和结束位置,进而可以将开始位置和结束位置的区间代码全部删除,以完成优化。实际应用中,代码删除方案的可行性还可以根据开发语言的规范证明来对正确性进行验证,比如,根据java虚拟机规范证明来对正确性进行验证。
以上结合具体应用场景对本发明实施例做进一步详细说明,以下场景是基于java开发环境进行的,实际应用中,本申请方案还可以应用到其他开发语言中,本申请对此不作限制。具体地,如图2所示,
步骤201:遍历项目(也即程序)中每一处invoke,确定出待处理的invoke(也即目标调用指令)。
步骤202:确定出待处理的invoke所需出栈多少操作数,也即确定出待处理的invoke所需参数的数量。
这里,实际应用中,由于调用指令所需的参数会在调用指令运行前进入操作数栈,而且,为了确保调用指令运行后操作数栈的栈存储状态不变,在调用指令的运行过程中,由于该调用指令而入操作数栈的参数会随着调用指令的运行而相继出栈;因此,这里确定的所需出栈多少操作数,即为调用指令运行过程中所需参数的数量,如此,便于向上查找出调用指令的开始位置。
实际应用中,也可以用栈集合的方式来统计待处理的invoke所需出栈多少操作数,比如,将待处理的invoke所需出栈多少操作数放入需要入栈的栈集合inStack中。
步骤203:确定出待处理的invoke所需入栈多少操作数,也即确定出待处理的invoke所需输出的返回值的数量。
这里,实际应用中,由于调用指令所需的输出的返回值会在调用指令运行过程中进入操作数栈,而且,为了确保调用指令运行后操作数栈的栈存储状态不变,在调用指令的运行结束前,由于该调用指令而入操作数栈的返回值还会相继出栈;因此,这里确定的所需入栈多少操作数,即为调用指令运行过程中所需输出的返回值的数量,如此,便于向下查找出调用指令的结束位置。
实际应用中,也可以用栈集合的方式来统计待处理的invoke所需入栈多少操作数,比如,将待处理的invoke所需入栈多少操作数放入需要出栈的栈集合outStack中。
步骤204:对于inStack不为空的情况下(也即待处理的invoke所需参数的数量大于等于1),向上查找入操作数栈的参数,然后分析该入操作数栈的参数的入栈情况,并相应处理需要分析的栈集合inStack,依此循环,直至inStack为空,则确定出待处理的invoke所需参数中,第一个入操作数栈的参数所在位置,该位置即为待处理的invoke运行的开始位置。
步骤20:5:对于outStack不为空的情况下(也即待处理的invoke所需输出的返回值的数量大于等于1),向下查找出操作数栈的返回值,然后分析该出操作数栈的返回值的出栈情况,并相应处理需要分析的栈集合outStack,依此循环,直至outStack为空,则确定出待处理的invoke所需输出的返回值中,最后一个出操作数栈的返回值所在位置,该位置即为待处理的invoke运行的结束位置。
这里,需要注意的是,调用指令的返回值可能存在被其他指令接收的情况,此时,跳过优化,不作优化处理。
实际应用中,若采用本申请方案对调用指令对应的开始位置至结束位置的一段代码进行直接删除后,会导致整个程序的针对该删除的调用指令存在两个frame属性的问题,进而导致后续校验失败,所以,为解决此问题,需要确认指令开始索引(startIndex)(用于向上遍历以查找开始位置)前面和指令结束索引(endIndex)(用于向下遍历以查找结束位置)后面是否均存在针对删除的调用指令的frame属性,若是,需要删除一个frame属性(比如删除前面的frame属性)。当然,当本申请方案应用于其他开发语言时,还可以根据其他开发环境所遇到的问题进行适当调整,本申请实施例对此不作限制。
如此,确定出调用指令的开始位置和结束位置,进而有效的完成对调用指令的优化处理。
本申请实施例还提供了一种调用指令的优化装置,如图3所示,所述装置包括:
检测单元31,用于确定出目标调用指令,以及目标调用指令所对应的目标指令描述特征,所述目标指令描述特征至少表征运行目标调用指令所需参数的第一参数特征,以及所需返回值的第二参数特征;其中,所述目标调用指令在运行过程中能够基于第一参数特征从操作数栈中读取所需参数,以及基于第二参数特征将所需输出的返回值存入所述操作数栈;检测目标调用指令在运行过程中所述操作数栈的栈存储状态的变化特征;
处理单元32,用于基于运行目标调用指令所需参数的第一参数特征和所需返回值的第二参数特征,以及所述操作数栈的栈存储状态的变化特征确定出目标调用指令运行的开始位置和/或结束位置,其中,基于确定出的开始位置和/或结束位置能够完成对目标调用指令的优化处理。
在一具体实施例中,所述检测单元31,还用于:
获取目标调用指令运行前所述操作数栈的第一栈存储状态特征;
检测目标调用指令在运行过程中所述操作数栈的第二栈存储状态特征;
基于第一栈存储状态特征以及第二栈存储状态特征确定出操作数栈的栈存储状态的变化特征。
在一具体实施例中,在目标调用指令开始运行前以及结束运行后,所述操作数栈的栈存储状态不变。
在一具体实施例中,所述处理单元32,还用于:
基于第一参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需参数存入所述操作数栈的执行代码所在位置;
从目标调用指令所需参数存入所述操作数栈的执行代码所在位置中,选取出首次将目标调用指令所需参数存入所述操作数栈的执行代码所在位置作为开始位置。
在一具体实施例中,所述处理单元32,还用于:
基于第二参数特征以及操作数栈的栈存储状态的变化特征,检测得到将目标调用指令所需输出的返回值存入所述操作数栈之后,移出所述操作数栈的执行代码所在位置;
从移出所述操作数栈的执行代码所在位置中,选取出末次将目标调用指令所需输出的返回值移出所述操作数栈后的执行代码所在位置作为结束位置。
在一具体实施例中,所述检测单元31,用于:
检测到调用指令,判断调用指令的指令描述特征所表征的函数是否为待检测函数;若是,将调用指令作为目标调用指令;或者,
确定出待检测函数,将待检测函数所对应的调用指令作为目标调用指令。
这里需要指出的是:以上装置实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果,因此不做赘述。对于本发明装置实施例中未披露的技术细节,本领域的技术人员请参照本发明方法实施例的描述而理解,为节约篇幅,这里不再赘述。
本申请实施例还提供了一种调用指令的优化设备,包括:一个或多个处理器;与所述一个或多个处理器通信连接的存储器;一个或多个应用程序;其中,所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序被配置为执行以上所述的方法。
在一具体示例中,本申请实施例所述的检测设备可具体为如图4所示的结构,所述检测设备至少包括处理器41、存储介质42以及至少一个外部通信接口43;所述处理器41、存储介质42以及外部通信接口43均通过总线44连接。所述处理器41可为微处理器、中央处理器、数字信号处理器或可编程逻辑阵列等具有处理功能的电子元器件。所述存储介质中存储有计算机可执行代码,所述计算机可执行代码能够执行以上任一实施例所述的方法。在实际应用中,所述检测单元31以及处理单元32均可以通过所述处理器41实现。
这里需要指出的是:以上检测设备实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果,因此不做赘述。对于本发明检测设备实施例中未披露的技术细节,本领域的技术人员请参照本发明方法实施例的描述而理解,为节约篇幅,这里不再赘述。
本申请实施例还提供了一种计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现以上所述的方法。
这里,计算机可读存储介质可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读存储介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式只读存储器(CDROM)。另外,计算机可读存储介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读存储介质中。所述存储介质可以是只读存储器,磁盘或光盘等。
上述所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。