CN115629764A - 一种Java程序静态编译方法及装置 - Google Patents
一种Java程序静态编译方法及装置 Download PDFInfo
- Publication number
- CN115629764A CN115629764A CN202211313721.9A CN202211313721A CN115629764A CN 115629764 A CN115629764 A CN 115629764A CN 202211313721 A CN202211313721 A CN 202211313721A CN 115629764 A CN115629764 A CN 115629764A
- Authority
- CN
- China
- Prior art keywords
- function
- analysis result
- java program
- program
- analysis
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本说明书一个或多个实施例提供一种Java程序静态编译方法及装置。所述方法包括:响应于Java程序的程序代码发生修改,确定Java程序的目标函数为发生修改的程序代码段所位于的函数;基于发生修改前的程序代码针对目标函数进行函数内分析,得到Java程序的第一分析结果,以及,基于发生修改后的程序代码针对目标函数进行函数内分析,得到Java程序的第二分析结果;确定第一分析结果与第二分析结果是否一致;如果一致,则获取针对程序代码发生修改前的Java程序进行全局静态分析得到的静态分析结果,并基于获取到的静态分析结果,针对程序代码发生修改后的Java程序进行静态编译。从而提高Java程序静态编译的效率。
Description
技术领域
本说明书一个或多个实施例涉及静态编译技术领域,尤其涉及一种Java程序静态编译方法、装置、电子设备及机器可读存储介质。
背景技术
Java程序静态编译,是一种可以将Java程序从平台无关的字节码,提前编译为目标平台的机器码的技术。静态编译技术可以帮助Java程序更好地适用于云计算场景,尤其是无服务计算(Serverless Computing)场景。
目前由Oracle开发的开源项目Graal VM的静态编译子项目Substrate VM,可以提供Java程序静态编译所需的编译工具链、编译框架、编译器和运行时等全套支持,但是仍然存在静态编译耗时较长的问题。
在相关技术中,如果Java程序的程序代码发生修改,通常需要先针对Java程序重新进行全局静态分析,以获得代码可达性和函数调用图(call graph),来指导针对程序代码发生修改后的Java程序进行静态编译,导致静态分析的耗时较长,静态编译的效率降低的问题。
发明内容
本申请提供一种Java程序静态编译方法,所述方法包括:
响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;
基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;
确定所述第一分析结果与所述第二分析结果是否一致;
如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
本申请还提供一种Java程序静态编译装置,所述装置包括:
第一确定单元,用于响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;
函数内分析单元,用于基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;
第二确定单元,用于确定所述第一分析结果与所述第二分析结果是否一致;
静态编译单元,用于如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
本申请还提供一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行上述方法。
本申请还提供一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现上述方法。
通过以上实施例,在Java程序的程序代码发生修改的情况下,可以基于发生修改前后两个版本的程序代码,以发生修改的代码段所位于的目标函数为起点,针对所述Java程序的目标函数进行函数内分析,得到所述Java程序的第一分析结果和第二分析结果;如果所述第一分析结果与所述第二分析结果一致,也即针对所述Java程序进行局部静态分析的分析结果一致,则可以认为修改内容对全局静态分析结果的影响有限,无需重新进行全局静态分析,可以重用针对程序代码发生修改前的所述Java程序的全局静态分析结果,来针对程序代码发生修改后的Java程序进行静态编译。相较于直接重新进行全局静态分析的实现方式,可以减少针对程序代码发生修改后的Java程序进行静态分析的耗时,从而提高了针对程序代码发生修改后的Java程序进行静态编译的效率。
附图说明
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是一示例性的实施例示出的一种Java程序静态编译方法的流程示意图;
图2是一示例性的实施例示出的一种Java程序静态编译方法的流程图;
图3是一示例性的实施例示出的一种发生修改前的程序代码的示意图;
图4是一示例性的实施例示出的一种第一分析结果的示意图;
图5是一示例性的实施例示出的一种第一图中间表示的示意图;
图6是一示例性的实施例示出的一种发生修改后的程序代码的示意图;
图7是一示例性的实施例示出的一种第二分析结果的示意图;
图8是一示例性的实施例示出的一种第二图中间表示的示意图;
图9是一示例性的实施例示出的另一种第二图中间表示的示意图;
图10是一示例性的实施例示出的一种Java程序的程序代码的示意图;
图11是一示例性的实施例示出的一种Java程序静态编译装置所在电子设备的结构示意图;
图12是一示例性的实施例示出的一种Java程序静态编译装置的框图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
为了使本技术领域的人员更好地理解本说明书实施例中的技术方案,下面先对本说明书实施例涉及的静态编译的相关技术,进行简要说明。
Java程序的源代码,通常需要先编译为与平台无关的字节码(byte code),再由JVM(Java Virtual Machine,Java虚拟机)解释执行;其中,解释执行是指由JVM将字节码解析为汇编代码,然后执行的过程。
其中,JVM可以提供跨平台能力,以支持与平台无关的Java字节码可以在不同的操作系统中运行。但是,由于Java程序并不是即起即用的,而需要经过虚拟机初始化后才能达到可用状态,再经过程序预热才能达到最佳性能,因此造成了Java程序的冷启动开销较大的问题。为了解决冷启动问题,在不需要跨平台能力的情况下,可以将Java程序直接编译为与某个平台对应的机器码(machine code),并提供必要的运行时支持,让其以操作系统原生程序的形式运行,这就是Java程序的静态编译技术。
Java程序静态编译,是一种可以将Java程序从平台无关的字节码,提前编译为目标平台的机器码的技术。其中,“静态”是相对传统Java程序的动态性而言的,传统Java程序是在运行时动态地解释执行和JIT(Just In Time,实时)编译,而静态编译需要在执行前就静态地完成程序的编译。
通过静态编译技术,可以彻底解决Java程序的冷启动开销较大的问题,无须初始化JVM和程序预热,直达峰值性能;另外,由于静态编译后的可执行程序已经是本地程序,而且可以包含轻量级运行时支持,因此不再额外需要JVM,可以进行直接部署;还可以消除传统Java语言与原生码(native code)的边界,提高Java程序跨语言访问的性能;还可以提高Java程序的安全性,避免通过动态加载、字节码插桩等方式被注入恶意代码。上述优点可以帮助Java程序更好地适用于云计算场景,尤其是无服务计算(Serverless Computing)场景。
目前由Oracle开发的开源项目Graal VM的静态编译子项目Substrate VM,可以提供Java程序静态编译所需的编译工具链、编译框架、编译器和运行时等全套支持。但是目前Substrate VM静态编译器还没有达到开箱可用的状态,依然存在编译耗时太长、不能完全兼容传统Java应用、适配改造成本高等诸多挑战。
其中,静态编译的耗时较长,主要是因为Substrate VM的静态编译重度依赖于消耗资源和时间较多的Java程序静态分析,以获得代码可达性和函数调用图(call graph),来指导Java程序静态编译。
在相关技术中,如果Java程序的程序代码发生修改,通常需要以所述Java程序的入口函数为起点,先针对程序代码发生修改后的Java程序重新进行全局静态分析,以得到新的全局静态分析结果;再基于新的全局静态分析结果,针对程序代码发生修改后的Java程序进行静态编译。
由此可见,在以上示出的实施例中,在Java程序的程序代码发生修改的情况下,针对Java程序重新进行全局静态分析的耗时较长,进而导致Java程序静态编译的效率降低。
实际上,在某些情况下,Java程序中的某个函数对应的程序代码发生修改,对静态分析结果的影响可能仅仅局限在该函数内,因此无需重新进行全局静态分析,可以考虑重用已有的针对程序代码发生修改前的Java程序的全局静态分析结果。
有鉴于此,本说明书旨在提出一种基于针对程序代码发生修改的Java程序进行局部静态分析的分析结果,判断是否可重用针对程序代码发生修改前的Java程序的全局静态分析结果,来针对程序代码发生修改后的所述Java程序进行静态编译的技术方案。
在实现时,响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;进一步地,可以基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,可以基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;进一步地,可以确定所述第一分析结果与所述第二分析结果是否一致;如果所述第一分析结果与所述第二分析结果一致,则可以获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并可以基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
例如,请参见图1,图1是一示例性的实施例示出的一种Java程序静态编译方法的流程示意图。如图1所示,响应于Java程序的目标函数(method)对应的代码段发生修改,可以分别基于发生修改前的程序代码与发生修改后的程序代码,将所述目标函数作为起点(也即如图1所示的new root method 1和new root method 2,针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果和第二分析结果;进一步地,可以确定所述第一分析结果与所述第二分析结果是否一致;如果一致,则可以获取针对程序代码发生修改前的所述Java程序的全局静态分析结果,并可以重用获取到的全局静态分析结果,针对程序代码发生修改后的Java程序进行静态编译;如果不一致,则可以将所述Java程序的入口函数作为起点(也即如图1所示的root method,通常可以是main函数)作为起点,针对程序代码发生修改后的Java程序重新进行全局静态分析,并基于重新生成的全局静态分析结果,针对程序代码发生修改后的Java程序进行静态编译。
由此可见,在本说明书中的技术方案中,在Java程序的程序代码发生修改的情况下,可以基于发生修改前后两个版本的程序代码,以发生修改的代码段所位于的目标函数为起点,针对所述Java程序的目标函数进行函数内分析,得到所述Java程序的第一分析结果和第二分析结果;如果所述第一分析结果与所述第二分析结果一致,也即针对所述Java程序进行局部静态分析的分析结果一致,则可以认为修改内容对全局静态分析结果的影响有限,无需重新进行全局静态分析,可以重用针对程序代码发生修改前的所述Java程序的全局静态分析结果,来针对程序代码发生修改后的Java程序进行静态编译。相较于直接重新进行全局静态分析的实现方式,可以减少针对程序代码发生修改后的Java程序进行静态分析的耗时,从而提高了针对程序代码发生修改后的Java程序进行静态编译的效率。
下面通过具体实施例,并结合具体的应用场景对本申请进行描述。
请参见图2,图2是一示例性的实施例示出的一种Java程序静态编译方法的流程图。所述方法可以执行以下步骤:
步骤202:响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数。
例如,响应于Java程序的程序代码发生修改,可以扫描发生修改前的程序代码和发生修改后的程序代码,以定位出发生修改的程序代码段,并可以将发生修改的程序代码段所位于的函数确定为所述Java程序的目标函数。
需要说明的是,在以上示出的实施例中,关于扫描程序代码以定位出发生修改的程序代码段的具体实现方式,本说明书中不做特别限定。例如,可以采用成熟的代码分析工具,扫描发生修改前后两个版本的程序代码,以定位出发生修改的程序代码段;其中,所述程序代码具体可以包括但不限于所述Java程序的源代码、字节码、中间表示(IR,Intermediate Representation)等。
为了使本技术领域的人员更好地理解本说明书实施例中的技术方案,下面将结合图3-图9对本说明书中的实施例进行说明。
请参见图3和图6,图3是一示例性的实施例示出的一种发生修改前的程序代码的示意图,图6是一示例性的实施例示出的一种发生修改后的程序代码的示意图。例如,在所述步骤202中,响应于Java程序的程序代码发生修改,可以扫描发生修改前的程序代码和发生修改后的程序代码,可以定位出如图3所示的发生修改前的程序代码段、以及如图6所示的发生修改后的程序代码段;进一步地,可以将如图3所示的发生修改前的程序代码段所位于的函数exec1()、和如图6所示的发生修改后的程序代码段所位于的函数exec2()确定为所述Java程序的目标函数;其中,所述目标函数可以用于实现统计元音字母数目这一功能。
换言之,在发生修改前的所述Java程序的程序代码中,可以通过函数exec1()实现统计元音字母数目的功能;响应于Java程序的程序代码发生修改,修改为通过函数exec2()实现统计元音字母数目的功能,可以确定所述Java程序的目标函数为函数exec1()和函数exec2()。
需要说明的是,在以上示出的实施例中,在发生修改前后两个版本的程序代码中,所述目标函数的函数名也发生修改,仅仅是一种示例性的描述,并不对本说明书做出特殊限定;例如,可以只对Java程序的目标函数的方法体进行修改,而并未对该目标函数的函数名进行修改,在此不再一一穷举。
另外,在所述步骤202中,除了可以通过扫描程序代码的方式来确定所述Java程序的目标函数,还可以通过其他方式来确定所述Java程序的目标函数,在此无法一一穷举。例如,可以在Java程序的程序代码发生修改时,生成用于记录修改内容的log,后续就可以根据log来确定所述Java程序的目标函数。
步骤204:基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果。
例如,请参见图4和图7,图4是根据图3所示实施例的基础上示出的一种第一分析结果的示意图,图7是根据图6所示实施例的基础上示出的一种第二分析结果的示意图。请结合图3、图4、图6和图7,在确定所述Java程序的目标函数为函数exec1()和函数exec2()之后,可以基于发生修改前的程序代码针对目标函数exec1()进行函数内分析,得到如图4所示的所述Java程序的第一分析结果;以及,可以基于发生修改后的程序代码针对目标函数exec2()进行函数内分析,得到如图7所示的所述Java程序的第二分析结果。
需要说明的是,在所述步骤204中,所述函数内分析,也可以被称作过程内分析,本说明书对此不作特别限定。在以上示出的实施例中,可以将所述目标函数视为黑盒,在假设外部环境不发生变化的前提下,直接以所述目标函数为分析起点进行过程内分析,而不涉及由函数内方法调用触发的过程间分析,因此可以实现线性时间复杂度的局部静态分析,相较于指数级时间复杂度的全局静态分析,可以显著缩短针对程序代码发生修改后的Java程序进行静态分析的耗时,提高静态分析效率。
在示出的一种实施方式中,为了提高针对所述目标函数进行函数内分析的效率,可以基于与所述Java程序的程序代码对应的图IR(Graphical IR,图中间表示),针对所述目标函数进行函数内分析。
为了便于理解,先对图IR进行简单介绍。在实际应用中,IR根据其组织结构,可以分为线性IR(Linear IR,线性中间表示)、图IR和混合IR(Hybrid IR,混合中间表示);其中,线性IR类似于某些抽象机的伪代码,对应的算法可以通过迭代来遍历线性操作序列;图IR可以将编译过程的知识保存在图中,对应的算法可以通过对图中的节点、边等元素进行操作,例如,Sea of Nodes IR是一种典型的图IR;混合IR可以结合图IR和线性IR的要素,可以使用线性IR来表示无循环代码块,使用图IR来表示这些代码块之间的控制流。关于图IR,未详尽描述之处请参见相关技术,在此不做赘述。
在实现时,在所述步骤204中,所述基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,具体可以包括:扫描与所述发生修改前的程序代码对应的第一图中间表示,在所述第一图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第一图节点;提取所述第一图节点的节点信息,并根据所述第一图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果;
所述基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果,具体可以包括:扫描与所述发生修改后的程序代码对应的第二图中间表示,在所述第二图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第二图节点;提取所述第二图节点的节点信息,并根据所述第二图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果。
在一个可能的实施例中,所述第一图中间表示和所述第二图中间表示,具体可以包括:基于Graal编译器生成的图中间表示,也即Graal IR。
例如,请参见图5、图8和图9,图5是根据图3所示实施例的基础上示出的一种第一图中间表示的示意图,图8是根据图6所示实施例的基础上示出的一种第二图中间表示的示意图,图9是根据图6所示实施例的基础上示出的另一种第二图中间表示的示意图。请结合图3-图5,可以扫描与目标函数exec1()对应的第一Graal IR,在如图5所示的第一GraalIR包括的至少一个图节点中,定位出与目标函数exec1()相关的第一图节点501;还可以提取第一图节点501的节点信息,并根据第一图节点501的节点信息针对目标函数exec1()进行函数内分析,得到如图4所示的第一分析结果。
类似地,请结合图6-图9,可以扫描与目标函数exec2()对应的第二Graal IR,在如图8所示的第二Graal IR包括的至少一个图节点中,定位出与目标函数exec2()相关的第二图节点801,也即与调用新的函数nextLine()相关的图节点;还可以提取第二图节点801的节点信息,并根据第二图节点801的节点信息针对目标函数exec2()进行函数内分析,得到如图7所示的第二分析子结果701;以及,可以在如图9所示的第二Graal IR包括的至少一个图节点中,定位出与目标函数exec2()相关的第二图节点901,也即与为新的对象字段value进行赋值相关的图节点;还可以提取第二图节点901的节点信息,并根据第二图节点901的节点信息针对目标函数exec2()进行函数内分析,得到如图7所示的第二分析子结果702。
需要说明的是,在以上示出的实施例中,一方面,Graal IR可以包含所述Java程序的数据流和控制流信息,其本身的图结构特点可以简化这种依赖于变量use-define chain(UD链,使用变量代表use,赋值代表define)的“溯源”操作;另一方面,Graal IR所表征的程序不依赖变量概念,因此不受变量名重构带来的影响。
其中,关于需要定位出的与所述目标函数相关的第一图节点和/或第二图节点,具体可以包括以下示出的一种或多种类型的节点:
(1)InvokeWithExceptionNode,对应函数的调用(也即方法调用);
(2)NewInstanceNode,对应对象的创建;
(3)StoreFieldNode,对应对象字段的赋值;
(4)LoadFieldNode,对应对象字段的取值;
(5)ParameterNode,对应方法的参数;
(6)ReturnNode,对应方法的返回值。
其中,在扫描与所述Java程序的程序代码对应的图IR之前,所述方法还可以包括:获取所述Java程序的字节码文件,并基于Graal编译器生成所述Java程序的字节码文件对应的图IR。
例如,可以获取程序代码发生修改前后的所述Java程序的源代码文件(如.java文件),并可以通过javac工具将所述源代码文件编译为平台无关的字节码文件(如.class文件);进一步地,可以基于Graal编译器生成发生修改前的所述Java程序的字节码文件对应的第一Graal IR,以及,可以基于Graal编译器生成发生修改后的所述Java程序的字节码文件对应的第二Graal IR。
在另一个可能的实施例中,所述第一图节点和/或所述第二图节点的节点信息,具体可以包括所述目标函数的参数类型信息。在这种情况下,可以针对所述目标函数进行基于符号执行的部分类型流分析,也即,可以针对所述目标函数的参数类型信息的参数类型信息进行符号化表示,并根据符号化表示后的参数类型信息,针对所述目标函数进行函数内的类型流分析。这是因为相较于全局静态分析,将所述目标函数作为局部静态分析的起点进行函数内分析,外部真实的输入信息是未知的,需要利用符号化标识的参数类型信息,对运行时的输入参数类型进行抽象化表示;在针对所述目标函数进行函数内分析的过程中,所述目标函数的参数类型可以一直以符号化表示的形式存在,并且可以伴随目标函数内数据流传播,直至得到所述Java程序的第一分析结果和/或第二分析结果。
在实现时,所述根据所述第一图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,具体可以包括:对提取到的所述第一图节点的第一参数类型信息进行符号化表示,并根据符号化表示后的第一参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第一分析结果;
以及,所述根据所述第二图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果,具体可以包括:对提取到的所述第二图节点的第二参数类型信息进行符号化表示,并根据符号化表示后的第二参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第二分析结果。
其中,关于对参数类型信息进行符号化标识的具体实现方式,本说明书中不做特别限定,本领域技术人员可以按需灵活设置。对所述第一参数类型信息和/或进行符号化表示,具体可以包括:在所述第一参数类型信息中添加符号标识;所述对提取到的所述第二图节点的第二参数类型信息进行符号化表示,具体可以包括:在提取到的所述第二图节点的第二参数类型信息中添加符号标识。
例如,从与目标函数相关的图节点中提取出的参数类型信息可以为
(T1 param1,T2 param2,…,Tnparamn);其中,parami(i=1,2,…,n)可以表示所述目标函数的第i个参数,Ti(i=1,2,…,n)可以表示第i个参数的参数类型;对所述参数类型信息进行符号化表示后,可以得到(T1#Symbol param1,T2#Symbol param2,…,Tn#Symbolparamn),其中,#Symbol可以表示所述符号标识,Ti#Symbol可以表示对参数类型Ti进行符号化表示后得到的结果。
需要说明的是,由于不同参数的参数类型可能相同,为了避免抽象化降低针对所述目标函数进行函数内分析的准确度,在抽象化输入的同时应当保留参数的位置信息;也即,对于不同参数的同一参数类型Ti=Tj(i≠j),其符号化表示得到的结果应当可以被区分,Ti#Symbol≠Tj#Symbol。
步骤206:确定所述第一分析结果与所述第二分析结果是否一致;
步骤208:如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
例如,请结合图3、图4、图6和图7,在确定所述Java程序的目标函数为函数exec1()和函数exec2(),并得到如图4所示的所述Java程序的第一分析结果、和如图7所示的所述Java程序的第二分析结果之后,可以确定所述第一分析结果与所述第二分析结果是否一致;一方面,可以确定如图4所示的第一分析子结果401与如图7所示的第二分析子结果701不一致,这是因为在如图3所示的发生修改前的程序代码中,在目标函数exec1()的函数内调用了函数next(),而在如图6所示的发生修改后的程序代码中,在目标函数exec2()的函数内调用了函数nextLine(),也即存在新的函数调用;另一方面,可以确定如图4所示的第一分析结果不包括如图7所示的第二分析子结果702,这是因为在如图6所示的发生修改后的程序代码中,在目标函数exec1()的函数内为字段value进行赋值,也即存在对新的对象字段的赋值;基于上述两个方面,可以确定所述第一分析结果与所述第二分析结果不一致,可以认为修改内容对静态分析结果的影响可能已经超出所述目标函数内部,因此可以针对程序代码发生修改后的所述Java程序重新进行全局静态分析,并基于重新生成的全局静态分析结果,针对程序代码发生修改后的Java程序进行静态编译。
又例如,如果所述第一分析结果与所述第二分析结果一致,则可以认为修改内容对静态分析结果的影响仅仅局限在所述目标函数内部,因此无需针对程序代码发生修改后的所述Java程序重新进行全局静态分析,可以直接获取已有的针对程序代码发生修改前的Java程序的全局静态分析结果,并基于获取到的所述全局静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
在示出的一种实施方式中,针对所述目标函数进行函数内分析而得到的局部分析结果的一致性,可以包括两个方面:函数签名的一致性;函数内可达代码的一致性。
其中,在所述步骤204中,所述第一分析结果,可以包括所述目标函数的第一函数签名(method signature)和第一函数内代码可达集合;所述第二分析结果,可以包括所述目标函数的第二函数签名和第二函数内代码可达集合。
具体地,所述第一函数签名,可以包括在发生修改前的代码中所述目标函数所属的类名(class name)、所述目标函数的函数名(method name)、所述目标函数的参数类型(parameter type)和所述目标函数的返回值类型(return type);所述第一函数内代码可达集合,可以包括在发生修改前的代码中所述目标函数的函数内可达类(reached class)、函数内可达方法(reached method)、函数内可达字段(reached field)中的至少一种。
所述第二函数签名,可以包括在发生修改后的代码中所述目标函数所属的类名、所述目标函数的函数名、所述目标函数的参数类型和所述目标函数的返回值类型;所述第二函数内代码可达集合,可以包括在发生修改后的代码中所述目标函数的函数内可达类、函数内可达方法、函数内可达字段中的至少一种。
在实现时,在所述步骤206中,所述确定所述第一分析结果与所述第二分析结果是否一致,具体可以包括:确定所述目标函数的第一函数签名与第二函数签名是否一致,以及,确定所述目标函数的第一函数内代码可达集合与第二函数内代码可达集合是否一致;如果所述第一函数签名与所述第二函数签名一致,且所述第一函数内代码可达集合与所述第二函数内代码可达集合一致,则确定所述第一分析结果与所述第二分析结果一致。
其中,所述第一函数内代码可达集合与所述第二函数内代码可达集合一致,可以理解为,所述第一函数内代码可达集合可以包含所述第二函数内代码可达集合。
需要说明的是,在以上示出的实施例中,在所述目标函数存在输入参数的情况下,如果不对参数类型信息进行符号化表示,可能会导致所述第一分析结果和/或所述第二分析结果出错,下面结合图10进行举例说明。
请参见图10,图10是一示例性的实施例示出的一种Java程序的程序代码的示意图。如图10所示,可以将函数oldFoo()和函数newFoo()分别视作Java程序的目标函数发生修改前后的两个版本;如果不对所述目标函数的参数类型Animal进行符号化表示,可以得到如表1所示的分析结果;如果对所述目标函数的参数类型Animal进行符号化表示,可以得到如
表2所示的分析结果;
Method | Reached Method |
oldFoo() | Animal.eat,Cat.eat |
newFoo() | Animal.eat,Cat.eat |
表1
Method | Reached Method |
oldFoo() | Animal#symbol.eat,Cat.eat |
newFoo() | Animal#symbol.eat,Animal.eat,Cat.eat |
表2
根据如表1所示的分析结果,与函数oldFoo()和函数newFoo()分别对应的可达方法相同,也即第一分析结果与第二分析结果一致,认为无需重新进行全局静态分析;而根据如表2所示的分析结果,与函数oldFoo()和函数newFoo()分别对应的可达方法不同,也即第一分析结果与第二分析结果不一致,认为需要重新进行全局静态分析;可见,得到了不同的结论。
实际上,如果对所述目标函数进行函数间分析,可以得到如表3所示的分析结果,
Method | Reached Method |
oldFoo() | Cat.eat |
newFoo() | Animal.eat,Cat.eat |
表3
根据如表3所示的分析结果,与函数oldFoo()和函数newFoo()分别对应的可达方法不同,也即第一分析结果与第二分析结果不一致,认为需要重新进行全局静态分析。
通过上述对不同分析方式的比较,可以发现,根据表2与表3所示的分析结果,才可以得到关于是否需要重新进行全局静态分析的正确结论;换言之,如果针对所述目标函数进行函数内分析,那么需要对所述目标函数的参数类型进行符号化表示,并根据符号化表示后的参数类型来针对所述目标函数进行函数内的类型流分析,最终才可以得到关于是否需要重新进行全局静态分析的正确结论,保证针对程序代码发生修改后的Java程序进行静态编译的编译结果的正确性。
通过以上技术方案可知,在Java程序的程序代码发生修改的情况下,可以基于发生修改前后两个版本的程序代码,以发生修改的代码段所位于的目标函数为起点,针对所述Java程序的目标函数进行函数内分析,得到所述Java程序的第一分析结果和第二分析结果;如果所述第一分析结果与所述第二分析结果一致,也即针对所述Java程序进行局部静态分析的分析结果一致,则可以认为修改内容对全局静态分析结果的影响有限,无需重新进行全局静态分析,可以重用针对程序代码发生修改前的所述Java程序的全局静态分析结果,来针对程序代码发生修改后的Java程序进行静态编译。相较于直接重新进行全局静态分析的实现方式,可以减少针对程序代码发生修改后的Java程序进行静态分析的耗时,从而提高了针对程序代码发生修改后的Java程序进行静态编译的效率。
与上述Java程序静态编译方法的实施例对应的,本说明书还提供了一种Java程序静态编译装置的实施例。
请参见图11,图11是一示例性的实施例示出的一种Java程序静态编译装置所在电子设备的硬件结构图。在硬件层面,该设备包括处理器1102、内部总线1104、网络接口1106、内存1108以及非易失性存储器1110,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器1102从非易失性存储器1110中读取对应的计算机程序到内存1108中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
请参见图12,图12是一示例性的实施例示出的一种Java程序静态编译装置的框图。该Java程序静态编译装置可以应用于如图11所示的电子设备中,以实现本说明书的技术方案。其中,所述Java程序静态编译装置可以包括:
第一确定单元1202,用于响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;
函数内分析单元1204,用于基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;
第二确定单元1206,用于确定所述第一分析结果与所述第二分析结果是否一致;
静态编译单元1208,用于如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
在本实施例中,所述第一确定单元1202,具体用于:
扫描发生修改前的程序代码和发生修改后的程序代码,定位出发生修改的程序代码段;
将发生修改的程序代码段所位于的函数确定为所述Java程序的目标函数。
在本实施例中,所述函数内分析单元1204,具体用于:
扫描与所述发生修改前的程序代码对应的第一图中间表示,在所述第一图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第一图节点;提取所述第一图节点的节点信息,并根据所述第一图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果;
以及,扫描与所述发生修改后的程序代码对应的第二图中间表示,在所述第二图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第二图节点;提取所述第二图节点的节点信息,并根据所述第二图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果。
在本实施例中,所述第一图中间表示和所述第二图中间表示,包括基于Graal编译器生成的图中间表示;
所述装置还包括:
编译单元,用于获取发生修改前的所述Java程序的字节码文件,并基于Graal编译器生成所述发生修改前的所述Java程序的字节码文件对应的第一图中间表示;以及,获取发生修改后的所述Java程序的字节码文件,并基于Graal编译器生成所述发生修改后的所述Java程序的字节码文件对应的第二图中间表示。
在本实施例中,所述节点信息包括所述目标函数的参数类型信息;
所述函数内分析单元1204,具体用于:
对提取到的所述第一图节点的第一参数类型信息进行符号化表示,并根据符号化表示后的第一参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第一分析结果;
以及,对提取到的所述第二图节点的第二参数类型信息进行符号化表示,并根据符号化表示后的第二参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第二分析结果。
在本实施例中,所述对提取到的所述第一图节点的第一参数类型信息进行符号化表示,包括:
在提取到的所述第一图节点的第一参数类型信息中添加符号标识;
所述对提取到的所述第二图节点的第二参数类型信息进行符号化表示,包括:
在提取到的所述第二图节点的第二参数类型信息中添加符号标识。
在本实施例中,所述第一分析结果包括所述目标函数的第一函数签名和第一函数内代码可达集合;其中,所述第一函数签名,包括在发生修改前的代码中所述目标函数所属的类名、所述目标函数的函数名、所述目标函数的参数类型和所述目标函数的返回值类型;所述第一函数内代码可达集合,包括在发生修改前的代码中所述目标函数的函数内可达类、函数内可达方法、函数内可达字段中的至少一种;
所述第二分析结果包括所述目标函数的第二函数签名和第二函数内代码可达集合;其中,所述第二函数签名,包括在发生修改后的代码中所述目标函数所属的类名、所述目标函数的函数名、所述目标函数的参数类型和所述目标函数的返回值类型;所述第二函数内代码可达集合,包括在发生修改后的代码中所述目标函数的函数内可达类、函数内可达方法、函数内可达字段中的至少一种;
所述第二确定单元1206,具体用于:
确定所述目标函数的第一函数签名与第二函数签名是否一致,以及,确定所述目标函数的第一函数内代码可达集合与第二函数内代码可达集合是否一致;
如果所述第一函数签名与所述第二函数签名一致,且所述第一函数内代码可达集合与所述第二函数内代码可达集合一致,则确定所述第一分析结果与所述第二分析结果一致。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例只是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
Claims (10)
1.一种Java程序静态编译方法,所述方法包括:
响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;
基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;
确定所述第一分析结果与所述第二分析结果是否一致;
如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
2.根据权利要求1所述的方法,所述确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数,包括:
扫描发生修改前的程序代码和发生修改后的程序代码,定位出发生修改的程序代码段;
将发生修改的程序代码段所位于的函数确定为所述Java程序的目标函数。
3.根据权利要求1所述的方法,
所述基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,包括:
扫描与所述发生修改前的程序代码对应的第一图中间表示,在所述第一图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第一图节点;
提取所述第一图节点的节点信息,并根据所述第一图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果;
所述基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果,包括:
扫描与所述发生修改后的程序代码对应的第二图中间表示,在所述第二图中间表示包括的至少一个图节点中定位出与所述目标函数相关的第二图节点;
提取所述第二图节点的节点信息,并根据所述第二图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果。
4.根据权利要求3所述的方法,所述第一图中间表示和所述第二图中间表示,包括基于Graal编译器生成的图中间表示;
在扫描与所述发生修改前的程序代码对应的第一图中间表示之前,所述方法还包括:
获取发生修改前的所述Java程序的字节码文件,并基于Graal编译器生成所述发生修改前的所述Java程序的字节码文件对应的第一图中间表示;
在扫描与所述发生修改后的程序代码对应的第二图中间表示之前,所述方法还包括:
获取发生修改后的所述Java程序的字节码文件,并基于Graal编译器生成所述发生修改后的所述Java程序的字节码文件对应的第二图中间表示。
5.根据权利要求3所述的方法,所述节点信息包括所述目标函数的参数类型信息;所述根据所述第一图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,包括:
对提取到的所述第一图节点的第一参数类型信息进行符号化表示,并根据符号化表示后的第一参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第一分析结果;
所述根据所述第二图节点的节点信息针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果,包括:
对提取到的所述第二图节点的第二参数类型信息进行符号化表示,并根据符号化表示后的第二参数类型信息,针对所述目标函数进行函数内的类型流分析,得到所述Java程序的第二分析结果。
6.根据权利要求5所述的方法,所述对提取到的所述第一图节点的第一参数类型信息进行符号化表示,包括:
在提取到的所述第一图节点的第一参数类型信息中添加符号标识;
所述对提取到的所述第二图节点的第二参数类型信息进行符号化表示,包括:
在提取到的所述第二图节点的第二参数类型信息中添加符号标识。
7.根据权利要求1所述的方法,所述第一分析结果包括所述目标函数的第一函数签名和第一函数内代码可达集合;其中,所述第一函数签名,包括在发生修改前的代码中所述目标函数所属的类名、所述目标函数的函数名、所述目标函数的参数类型和所述目标函数的返回值类型;所述第一函数内代码可达集合,包括在发生修改前的代码中所述目标函数的函数内可达类、函数内可达方法、函数内可达字段中的至少一种;
所述第二分析结果包括所述目标函数的第二函数签名和第二函数内代码可达集合;其中,所述第二函数签名,包括在发生修改后的代码中所述目标函数所属的类名、所述目标函数的函数名、所述目标函数的参数类型和所述目标函数的返回值类型;所述第二函数内代码可达集合,包括在发生修改后的代码中所述目标函数的函数内可达类、函数内可达方法、函数内可达字段中的至少一种;
所述确定所述第一分析结果与所述第二分析结果是否一致,包括:
确定所述目标函数的第一函数签名与第二函数签名是否一致,以及,确定所述目标函数的第一函数内代码可达集合与第二函数内代码可达集合是否一致;
如果所述第一函数签名与所述第二函数签名一致,且所述第一函数内代码可达集合与所述第二函数内代码可达集合一致,则确定所述第一分析结果与所述第二分析结果一致。
8.一种Java程序静态编译装置,所述装置包括:
第一确定单元,用于响应于Java程序的程序代码发生修改,确定所述Java程序的目标函数为发生修改的程序代码段所位于的函数;
函数内分析单元,用于基于发生修改前的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第一分析结果,以及,基于发生修改后的程序代码针对所述目标函数进行函数内分析,得到所述Java程序的第二分析结果;
第二确定单元,用于确定所述第一分析结果与所述第二分析结果是否一致;
静态编译单元,用于如果所述第一分析结果与所述第二分析结果一致,则获取针对程序代码发生修改前的所述Java程序进行全局静态分析得到的静态分析结果,并基于获取到的所述静态分析结果,针对程序代码发生修改后的所述Java程序进行静态编译。
9.一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行权利要求1至7任一项所述的方法。
10.一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现权利要求1至7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211313721.9A CN115629764A (zh) | 2022-10-25 | 2022-10-25 | 一种Java程序静态编译方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211313721.9A CN115629764A (zh) | 2022-10-25 | 2022-10-25 | 一种Java程序静态编译方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115629764A true CN115629764A (zh) | 2023-01-20 |
Family
ID=84905697
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211313721.9A Pending CN115629764A (zh) | 2022-10-25 | 2022-10-25 | 一种Java程序静态编译方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115629764A (zh) |
-
2022
- 2022-10-25 CN CN202211313721.9A patent/CN115629764A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110955431B (zh) | 编译环境的处理方法及装置 | |
US9524175B2 (en) | Target typing of overloaded method and constructor arguments | |
US8997066B2 (en) | Emulating pointers | |
US10614227B2 (en) | Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system | |
CN112905447B (zh) | 一种区块链虚拟机的测试方法和系统 | |
EP3084598B1 (en) | Execution guards in dynamic programming | |
US11157249B1 (en) | Method and system for identifying and extracting independent services from a computer program | |
CN116680015B (zh) | 函数调用方法、装置、电子设备及可读存储介质 | |
Sun et al. | {KSG}: Augmenting kernel fuzzing with system call specification generation | |
US20140196019A1 (en) | Method and Apparatus for Substituting Compiler Built-in Helper Functions with Machine Instructions | |
CN113094252A (zh) | 测试用例生成方法、装置、计算机设备及存储介质 | |
US8769498B2 (en) | Warning of register and storage area assignment errors | |
Paltoglou et al. | Automated refactoring of legacy JavaScript code to ES6 modules | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
Ferrara et al. | CIL to Java-bytecode translation for static analysis leveraging | |
Casinghino et al. | Using binary analysis frameworks: The case for BAP and angr | |
Baradaran et al. | A unit-based symbolic execution method for detecting memory corruption vulnerabilities in executable codes | |
CN115629764A (zh) | 一种Java程序静态编译方法及装置 | |
US11537372B2 (en) | Generating compilable machine code programs from dynamic language code | |
CN114691496A (zh) | 单元测试方法、装置、计算设备及介质 | |
CN114706586A (zh) | 代码编译、代码运行方法、装置、计算机设备及存储介质 | |
Mohsin | WGSLsmith: a random generator of WebGPU shader programs | |
Asryan et al. | Dynamic Detection of Use-After-Free Bugs | |
CN116700840B (zh) | 文件执行方法、装置、电子设备及可读存储介质 | |
CN116955209B (zh) | WebAssembly虚拟机的测试方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |