指针分析方法及装置转让专利

申请号 : CN201310589292.2

文献号 : CN104657257B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈聪明霍玮李丰冯晓兵

申请人 : 华为技术有限公司中国科学院计算技术研究所

摘要 :

本发明实施例提供一种指针分析方法及装置。本发明提供的指针分析方法,包括:读取待分析的多线程程序中的语句信息;根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;根据所述程序的共享信息对所述共享量进行补偿分析。本发明实施例解决现有技术中对多线程程序的指针分析仅局限于程序中的全局共享量,分析结果不全面的问题,提高了指针分析的精度,并相应地提高了程序优化的实施范围和效果。

权利要求 :

1.一种指针分析方法,其特征在于,包括:

读取待分析的多线程程序中的语句信息;

根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;

根据所述程序的语句信息生成并行控制流图;

根据所述并行控制流图和所述共享信息生成针对所述程序的共享量访存图SAG;

根据所述SAG对所述共享量进行补偿分析。

2.根据权利要求1所述的方法,其特征在于,所述根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,包括:根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;

对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。

3.根据权利要求2所述的方法,其特征在于,所述全局共享判断规则包括:若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。

4.根据权利要求2所述的方法,其特征在于,所述对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为,包括:对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集;

根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;

根据所述全局共享量、所述局部共享量和所述指针指向集对每个线程进行分析,获得与所述共享量对应的访存行为。

5.根据权利要求4所述的方法,其特征在于,所述局部共享判断规则包括:若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则所述变量为局部共享量;或者,若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则所述变量为局部共享量;或者,若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则所述变量为局部共享量。

6.根据权利要求4或5所述的方法,其特征在于,所述根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,包括:根据所述全局共享量、所述指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;

根据所述可能逃逸的局部变量和共享传播规则,确定从所述可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。

7.根据权利要求1所述的方法,其特征在于,所述共享量具有相应的定值点和引用点对;所述根据所述SAG对所述共享量进行补偿分析,包括:根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;

将所述定值点和引用点对之间可以相互影响的共享量的所述定值点的指针指向集传播到对应的引用点。

8.根据权利要求1所述的方法,其特征在于,所述读取待分析的多线程程序中的语句信息之前,还包括:接收用户发送的指针分析指令;

所述读取待分析的多线程程序中的语句信息,包括:

根据所述指针分析指令读取所述待分析的多线程程序中的语句信息。

9.根据权利要求1所述的方法,其特征在于,所述根据所述SAG对所述共享量进行补偿分析之后,还包括:采用所述补偿分析的结果,对所述程序进行优化处理。

10.一种指针分析装置,其特征在于,包括:

读取模块,用于读取待分析的多线程程序中的语句信息;

指针分析模块,用于根据所述读取模块读取的所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;

图像生成模块,用于根据所述程序的语句信息生成并行控制流图;并且根据所述并行控制流图和所述共享信息生成针对所述程序的共享量访存图SAG;

补偿分析模块,用于根据所述图像生成模块生成的所述SAG对所述共享量进行补偿分析。

11.根据权利要求10所述的装置,其特征在于,所述指针分析模块,包括:程序分析单元,用于根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;

线程分析单元,用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。

12.根据权利要求11所述的装置,其特征在于,所述全局共享判断规则包括:若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。

13.根据权利要求11所述的装置,其特征在于,所述线程分析单元,具体用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集;并且根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;

进而根据所述全局共享量、所述局部共享量和所述指针指向集对每个线程进行分析,获得与所述共享量对应的访存行为。

14.根据权利要求13所述的装置,其特征在于,所述局部共享判断规则包括:若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则所述变量为局部共享量;或者,若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则所述变量为局部共享量;或者,若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则所述变量为局部共享量。

15.根据权利要求13或14所述的装置,其特征在于,所述线程分析单元用于根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,具体包括:用于根据所述全局共享量、所述指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;

并且根据所述可能逃逸的局部变量和共享传播规则,确定从所述可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。

16.根据权利要求10所述的装置,其特征在于,所述共享量具有相应的定值点和引用点对;所述补偿分析模块,包括:判断单元,用于根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;

传播单元,用于将所述判断单元获取的所述定值点和引用点对之间可以相互影响的共享量的所述定值点的指针指向集传播到对应的引用点。

17.根据权利要求10所述的装置,其特征在于,还包括:接收模块,用于在所述读取模块读取待分析的多线程程序中的语句信息之前,接收用户发送的指针分析指令;

所述读取模块,具体用于根据所述接收模块接收的所述指针分析指令,读取所述待分析的多线程程序中的语句信息。

18.根据权利要求10所述的装置,其特征在于,还包括:优化模块,用于在所述补偿分析模块根据所述图像生成模块生成的所述SAG对所述共享量进行补偿分析之后,采用所述补偿分析的结果,对所述程序进行优化处理。

说明书 :

指针分析方法及装置

技术领域

[0001] 本发明实施例涉及计算机技术,尤其涉及一种指针分析方法及装置。

背景技术

[0002] 随着计算机的普及,计算机软件越来越复杂,其中使用的程序语句类型也更加灵活和丰富,以通常使用的C和C++程序语句为例进行说明,程序语句中指针的使用愈加广泛。指针语句的使用是决定程序被编译优化后运行性能优良的重要因素,因此,对于程序的编译优化基于对程序语句中指针的分析。
[0003] 对指针的分析一般指对该指针变量性质和指向集的分析。目前,在进行指针分析时,通常使用精度较高的流敏感上下文敏感(Flow-Sensitive and Context-Sensitive,简称为:FSCS)的分析方法,但直接使用该类方法不适用于多线程程序。一种直观的针对多线程程序的指针分析,可以通过对全局变量进行指针分析获取全局共享量对程序的并行区域内不同线程间的交互影响;具体地,分析全局共享量在各程序点的指针指向集、线程间交互指向集和当前程序语句执行结束后在指向图中新增的指向边。
[0004] 现有技术中对多线程程序的语句进行的指针分析方法,只考虑到全局共享量对程序的并行区域内线程间的交互影响,因此,进行指针分析的共享量仅局限于程序中的全局共享量,使得指针分析的对象,即程序中的共享量范围缩小,降低了指针分析的精度。

发明内容

[0005] 本发明实施例提供一种指针分析方法及装置,以解决现有技术中对多线程程序的指针分析仅局限于程序中的全局共享量,分析结果不全面的问题。
[0006] 第一方面,本发明实施例提供一种指针分析方法,包括:
[0007] 读取待分析的多线程程序中的语句信息;
[0008] 根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;
[0009] 根据所述程序的共享信息对所述共享量进行补偿分析。
[0010] 在第一方面的第一种可能实现方式中,所述根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,包括:
[0011] 根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;
[0012] 对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。
[0013] 根据第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述全局共享判断规则包括:
[0014] 若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。
[0015] 根据第一方面的第一种或第二种可能的实现方式,在第三种可能的实现方式中,所述对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为,包括:
[0016] 对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集;
[0017] 根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;
[0018] 根据所述全局共享量、所述局部共享量和所述指针指向集对每个线程进行分析,获得与所述共享量对应的访存行为。
[0019] 根据第一方面的第三种可能的实现方式,在第四种可能的实现方式中,所述局部共享判断规则包括:
[0020] 若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则所述变量为局部共享量;或者,
[0021] 若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则所述变量为局部共享量;或者,
[0022] 若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则所述变量为局部共享量。
[0023] 根据第一方面的第三种或第四种可能的实现方式,在第五种可能的实现方式中,所述根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,包括:
[0024] 根据所述全局共享量、所述指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;
[0025] 根据所述可能逃逸的局部变量和共享传播规则,确定从所述可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。
[0026] 根据第一方面、第一方面的第一种到第五种可能的实现方式中任一种,在第六种可能的实现方式中,所述根据所述程序的共享信息对每个共享量分别进行补偿分析之前,还包括:
[0027] 根据所述程序的语句信息生成并行控制流图;
[0028] 根据所述并行控制流图和所述共享信息生成针对所述程序的共享量访存图SAG;
[0029] 所述根据所述程序的共享信息对所述共享量进行补偿分析,包括:
[0030] 根据所述SAG对所述共享量进行补偿分析。
[0031] 根据第一方面、第一方面的第一种到第六种可能的实现方式中任一种,在第七种可能的实现方式中,所述共享量具有相应的定值点和引用点对;所述根据所述程序的共享信息对所述共享量进行补偿分析,包括:
[0032] 根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;
[0033] 将所述定值点和引用点对之间可以相互影响的共享量的所述定值点的指针指向集传播到对应的引用点。
[0034] 根据第一方面、第一方面的第一种到第七种可能的实现方式中任一种,在第八种可能的实现方式中,所述读取待分析的多线程程序中的语句信息之前,还包括:
[0035] 接收用户发送的指针分析指令;
[0036] 所述读取待分析的多线程程序中的语句信息,包括:
[0037] 根据所述指针分析指令读取所述待分析的多线程程序中的语句信息。
[0038] 根据第一方面、第一方面的第一种到第八种可能的实现方式中任一种,在第九种可能的实现方式中,所述根据所述程序的共享信息对所述共享量进行补偿分析之后,还包括:
[0039] 采用所述补偿分析的结果,对所述程序进行优化处理。
[0040] 第二方面,本发明实施例提供一种指针分析装置,包括:
[0041] 读取模块,用于读取待分析的多线程程序中的语句信息;
[0042] 指针分析模块,用于根据所述读取模块读取的所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;
[0043] 补偿分析模块,用于根据所述指针分析模块获得的所述程序的共享信息对所述共享量进行补偿分析。
[0044] 在第二方面的第一种可能实现方式中,所述指针分析模块,包括:
[0045] 程序分析单元,用于根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;
[0046] 线程分析单元,用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。
[0047] 根据第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述全局共享判断规则包括:
[0048] 若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。
[0049] 根据第二方面的第一种或第二种可能的实现方式,在第三种可能的实现方式中,所述线程分析单元,具体用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集;并且根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;进而根据所述全局共享量、所述局部共享量和所述指针指向集对每个线程进行分析,获得与所述共享量对应的访存行为。
[0050] 根据第二方面的第三种可能的实现方式,在第四种可能的实现方式中,所述局部共享判断规则包括:
[0051] 若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则所述变量为局部共享量;或者,
[0052] 若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则所述变量为局部共享量;或者,
[0053] 若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则所述变量为局部共享量。
[0054] 根据第二方面的第三种或第四种可能的实现方式,在第五种可能的实现方式中,所述线程分析单元用于根据所述全局共享量、所述指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,具体包括:
[0055] 用于根据所述全局共享量、所述指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;
[0056] 并且根据所述可能逃逸的局部变量和共享传播规则,确定从所述可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。
[0057] 根据第二方面、第二方面的第一种到第五种可能的实现方式中任一种,在第六种可能的实现方式中,所述装置还包括:图像生成模块,用于在所述补偿分析模块根据所述指针分析模块获得的所述程序的共享信息对每个共享量分别进行补偿分析之前,根据所述程序的语句信息生成并行控制流图;并且根据所述并行控制流图和所述共享信息生成针对所述程序的共享量访存图SAG;
[0058] 所述补偿分析模块,具体用于根据所述图像生成模块生成的所述SAG对所述共享量进行补偿分析。
[0059] 根据第二方面、第二方面的第一种到第六种可能的实现方式中任一种,在第七种可能的实现方式中,所述共享量具有相应的定值点和引用点对;所述补偿分析模块,包括:判断单元,用于根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;
[0060] 传播单元,用于将所述判断单元获取的所述定值点和引用点对之间可以相互影响的共享量的所述定值点的指针指向集传播到对应的引用点。
[0061] 根据第二方面、第二方面的第一种到第七种可能的实现方式中任一种,在第八种可能的实现方式中,所述装置还包括:接收模块,用于在所述读取模块读取待分析的多线程程序中的语句信息之前,接收用户发送的指针分析指令;
[0062] 所述读取模块,具体用于根据所述接收模块接收的所述指针分析指令,读取所述待分析的多线程程序中的语句信息。
[0063] 根据第二方面、第二方面的第一种到第八种可能的实现方式中任一种,在第九种可能的实现方式中,所述装置还包括:优化模块,用于在所述补偿分析模块根据所述指针分析模块获得的所述程序的共享信息对所述共享量进行补偿分析之后,采用所述补偿分析的结果,对所述程序进行优化处理。
[0064] 本实施例提供的指针分析方法及装置,通过读取多线程程序的语句信息对该程序进行指针分析,获得程序中全局共享量和局部共享量、指针指向集和针对上述共享量的访存行为,基于上述指针分析的结果,实现对程序中共享量的补偿分析,得到针对上述共享量在其定值点和引用点可能被定值或/和引用共享量的所有结果,即获得程序在任何可能的执行顺序后,其共享量被定值或/和引用的所有可能结果,解决现有技术中对多线程程序的指针分析仅局限于程序中的全局共享量,分析结果不全面的问题,提高了指针分析的精度,并相应地提高了程序优化实施范围和效果。

附图说明

[0065] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0066] 图1为本发明实施例一所提供的一种指针分析方法的流程图;
[0067] 图2为本发明实施例一所提供的一种非结构化多线程程序的结构示意图;
[0068] 图3为本发明实施例二所提供的一种指针分析方法的流程图;
[0069] 图4为本发明实施例所提供的一种多线程程序的SAG图;
[0070] 图5为本发明实施例三所提供的一种指针分析装置的结构示意图;
[0071] 图6为本发明实施例所提供的一种指针分析装置的结构示意图;
[0072] 图7为本发明实施例四所提供的一种指针分析装置的结构示意图;
[0073] 图8为本发明实施例五所提供的一种终端设备的结构示意图。

具体实施方式

[0074] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0075] 图1为本发明实施例一所提供的一种指针分析方法的流程图,本实施例提供的方法适用于对现有程序进行分析的情况,该方法可以由终端设备或指针分析装置执行,该指针分析装置通常以硬件和/或软件的方法来实现,可以集成在该终端设备的存储器中,供处理器调用执行。如图1所示,本实施例的方法可以包括:
[0076] S110,读取待分析的多线程程序中的语句信息;
[0077] 对当前多线程程序的分析,通常可以分析该程序中各线程的指针变量和指针指向集,因此,进行指针分析的终端设备在读取待分析的多线程程序中的语句信息后,才能对该程序进行指针分析。
[0078] 需要说明的是,对程序进行的指针分析,可以是用户对指定程序发起的,因此,本实施例在具体实现时,S110之前还包括:接收用户发送的指针分析指令;相应地,S110具体包括:根据指针分析指令读取该待分析的多线程程序中的语句信息。
[0079] S120,根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;
[0080] 终端设备基于程序的语句信息,对该程序进行指针分析,通常使用分析精度较高的FSCS的分析方式,采用FSCS的分析方式对程序进行分析时,通常按照程序中语句的逻辑顺序进行分析,若调换程序语句的执行顺序进行分析,分析的结果是不同的;相比之下,采用流不敏感上下文不敏感(Flow-Insensitive and Context-Insensitive,简称为:FICI)的分析方式对程序进行分析,在调换程序语句的执行顺序时,分析的结果是相同的,显然,FSCS的分析方式具有更高的分析精度;目前对程序语句中指针的分析,通常在程序的并行区域中使用FSCS分析方式时,仅分析程序中的全局共享量,以及该全局共享量对程序的线程间的交互产生影响,虽然FSCS分析方式具有一定的分析精度,但是该方法仍然没有分析出程序中所有的共享量;本实施例提供的指针分析方法,根据读取的程序语句对程序进行指针分析,具体获取的共享信息包括共享量、指针指向集和访存行为,并且,该共享量包括全局共享量和局部共享量,局部共享量是程序中线程的局部变量,被其他线程访问到而成为共享变量;相应地,获取的访存行为也是针对所有全局共享量和局部共享量的,因此,本实施例提供的指针分析方法,对程序中共享量的分析更加全面,不仅涉及全局共享量,而且涉及局部共享量以及所有共享量的访存行为。
[0081] S130,根据所述程序的共享信息对所述共享量进行补偿分析。
[0082] 图2为本发明实施例一所提供的一种非结构化多线程程序的结构示意图。基于对程序中指针分析的结果,对分析获得的共享量进行补偿分析,可以根据线程间的交互影响,获取其交互影响后产生的结果;具体地,在程序的并行区域内,尤其是非结构化的多线程程序内,程序中语句的运行顺序是有多种可能性的,通常在每个线程中按照程序语句顺序执行,但是程序的并行区域中线程之间语句的执行顺序存在多种可能性;以图2提供非结构化的多线程程序为例进行说明,线程间存在创建边和终止边,线程1的程序点A到C和线程2的程序点F到H之间为并行区域,线程3在线程2的程序点G执行后与线程1和2并行,在线程1的程序点E执行后终止线程1与线程3的并行,据此,程序点A执行后可能在程序点B、H或I执行,程序点H执行后可能在程序点E或I执行,因此,程序在执行语句的过程中存在多种执行顺序的可能性,从而需要对每种可能的执行顺序进行分析,进而可以分析出程序在任何可能的执行顺序中共享量的访存行为,即每个共享量在其定值点和引用点可能被定值或/和引用的所有结果。
[0083] 进一步地,本实施例提供的指针分析方法,还包括:采用所述补偿分析的结果,对所述程序进行优化处理;基于对程序中共享量和执行过程全面且详细的分析,在程序的优化处理中会提高优化效率和质量,具体地,对程序优化或者改进,其中优化是指使程序以更高的效率执行,改进是指对程序中的漏洞或错误进行发现或更改。
[0084] 本实施例提供的指针分析方法,通过读取多线程程序的语句信息对该程序进行指针分析,获得程序中全局共享量和局部共享量、指针指向集和针对上述共享量的访存行为,基于上述指针分析的结果,实现对程序中共享量的补偿分析,得到针对上述共享量在其定值点和引用点可能被定值或/和引用共享量的所有结果,即获得程序在任何可能的执行顺序后,其共享量被定值或/和引用的所有可能结果,解决现有技术中对多线程程序的指针分析仅局限于程序中的全局共享量,分析结果不全面的问题,提高了指针分析的精度,并相应地提高了程序优化的实施范围和效果。
[0085] 实施例二
[0086] 图3为本发明实施例二所提供的一种指针分析方法的流程图。如图3所示,本实施例的方法可以包括:
[0087] S200,接收用户发送的指针分析指令;
[0088] S210,根据所述指针分析指令读取待分析的多线程程序中的语句信息;
[0089] S220,根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;
[0090] 对程序进行指针分析时,可以根据全局共享判断规则先确定出程序中的全局共享量,对于全局共享量的判断是基于程序的整体结构来分析,具体地,该全局共享判断规则包括:若变量可以被程序中至少两个线程同时访问,则该变量为全局共享量。
[0091] S230,对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为;
[0092] 对程序中的每个线程进行指针分析,获得每个线程中的指针指向集,并基于已获取的全局共享量和指针指向集,根据指针算法的相应规则,进而可以获得线程中的局部共享量以及针对所有共享量的访存行为。
[0093] 在具体实现中,S230包括:S231,对程序中每个线程进行指针分析,获得每个线程中的指针指向集;S232,根据全局共享量、指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;S233,根据全局共享量、局部共享量和指针指向集对每个线程进行分析,获得与共享量对应的访存行为。
[0094] 需要说明的是,上述局部共享判断规则可以包括:若给定线程中变量可以作为该程序中某个线程的入口参数而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则该变量为局部共享量。
[0095] S240,根据所述程序的共享信息对共享量进行补偿分析。
[0096] S250,采用所述补偿分析的结果,对所述程序进行优化处理。
[0097] 本实施例提供的指针分析方法,通过读取多线程程序的语句信息对该程序进行指针分析,获得程序中全局共享量和局部共享量、指针指向集和针对上述共享量的访存行为,基于上述指针分析的结果,实现对程序中共享量的补偿分析,得到针对上述共享量在其定值点和引用点可能被定值或/和引用共享量的所有结果,即获得程序在任何可能的执行顺序后,其共享量被定值或/和引用的所有可能结果,解决现有技术中对多线程程序的指针分析仅局限于程序中的全局共享量,分析结果不全面的问题,提高了指针分析的精度,并相应地提高了程序优化的实施范围和效果。另外,首先分析程序中的全局共享量,从而可以全面的获得线程中的局部共享量和所有共享量的访存行为,使得指针分析可以以更优的顺序处理程序语句并获得全面的分析结果,进一步提高了程序优化的效率和质量。
[0098] 进一步地,本实施例提供的指针分析方法,S232具体包括:根据全局共享量、指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;根据可能逃逸的局部变量和共享传播规则,确定从可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。
[0099] 在具体实现时,局部共享识别规则可以包括四种基本类型,请参考表1,为本发明实施例所提供的一种指针分析方法的局部共享识别规则,具体包括Addr、Copy、Load和Store四种类型对应的赋值表达式和局部共享识别规则。
[0100]
[0101] 表1
[0102] 以图2所示非结构化多线程程序为例进行说明,显然,程序中的变量gp可以被线程1、2和3同时访问,即为全局共享量;对于局部共享量的判断,例如,根据Addr对应的表达式L=&R可知,若表达式左部的变量L为共享量,则右部的变量R即为共享量,并且属于变量R的嵌套指向集中所有的变量都为共享量,因此,程序点A的lx、程序点F的ly和程序点G的lz是可能逃逸的局部变量;基于已获取的可能逃逸的局部变量,根据共享传播规则对其进行分析,可以从可能逃逸的局部变量中获取的可能被其他线程使用的局部变量,即为局部共享量,请参考表2,为本发明实施例所提供的一种指针分析方法的局部共享传播规则,具体包括Copy、Load、Store和PHI四种类型对应的赋值表达式和局部共享传播规则。
[0103]
[0104] 表2
[0105] 类似地,与上述局部共享识别规则的判断方式类似,例如,根据Copy对应的表达式L=R可知,若表达式右部的变量R为共享量,则左部的变量L具有共享属性,即“拷贝指向集来自共享量R”的属性,表示为L具有共享属性“cpy_shared(R)”;根据上述局部共享传播规则可以从已知的可能逃逸的局部变量中确定出可能被其他线程使用的局部变量,即为局部共享量;本实施例提供的共享传播规则的方法,优选地,可以基于对程序的静态单赋值(Static Single Assignment,简称为:SSA)的表示,即区分程序中所有的变量的名称,以使所有变量在程序中只有一个赋值,使得变量和程序的描述清晰、便于分析,在实际程序中通常不需要以SSA来表示,通常多个变量可以使用一个名称,并且所述两种变量的表示方式是可以相互转换的。
[0106] 需要说明的是,上述表1和表2中规则的判断方式为:分子成立,则执行分母的操作;并且,在具体实现时,用于局部共享识别规则和共享传播规则的所有赋值表达式都可以分别转换为表1和表2所示的四种类型的表达式。
[0107] 可选地,本实施例提供的指针分析方法,S240之前包括:根据所述程序的语句信息生成并行控制流图;根据所述并行控制流图和所述共享信息生成针对所述程序的共享量访存图(Shared Access Graph,简称为:SAG);相应地,S240具体包括:根据所述SAG对所述共享量进行补偿分析。
[0108] 同样以图2所示的非结构化多线程程序为例进行说明,图4为本发明实施例所提供的一种多线程程序的SAG图。通常的,根据该多线程程序的语句信息可以生成并行控制流图,并将通过指针分析获取的共享量和与其对应的访存行为生成该程序的SAG图,SAG图可以直观的显示出该多线程程序的结构和程序点中共享量的访存行为,在此基础上,可以更准确的对该多线程程序中每个共享量分别进行补偿分析。
[0109] 需要注意的是,对于进行指针分析的程序来说,可以直接对指针分析的结果进行补偿分析,通过生成SAG图的方式进行补偿分析,可以使查看分析结果的程序员更直观的获取指针分析和补偿分析的信息,更有利于程序员对程序进行优化。
[0110] 共享量通常具有相应的定值点和引用点对,本实施例在具体实现中,S240包括:根据传播判断规则获得定值点和引用点对之间可以相互影响的共享量;将定值点和引用点对之间可以相互影响的共享量的定值点的指针指向集传播到对应的引用点。以图2所示程序为例,该程序中的共享量gp,在线程1中存在定值点A,在程序点A执行完之后,gp的指向集被更新为pts(lx),并且,gp在线程2和3中分别存在引用点H和I,补偿分析后,程序点A处gp的定值lx的指向集pts(lx)传播到gp的引用点,即程序点H和I。表3为针对图2所示程序的指针分析和补偿分析结果:
[0111]共享量 定值点 引用点 补偿分析结果
gp A H gp在H点可能指向lx,所以lx在H点可能被定值
gp A I gp在I点可能指向lx,所以lx在I点可能被引用
gp F C lp在C点可能指向ly,所以ly在C点可能被定值
gp G C lp在C点可能指向lz,所以lz在C点可能被定值
gp G I gp在I点可能指向lz,所以lz在I点可能被引用
lx H E lx在E点可能指向lb
lx C I lx在I点可能指向pts(la)
lz C I lz在I点可能指向pts(la)
lz H I lz在I点可能指向lb
lx H I lx在I点可能指向lb
[0112] 表3
[0113] 在具体实现中,上述传播判断规则包括:程序点X和Y之间是互相可能并行的,即只有可能并行的定值点和引用点之间才是可以互相补偿;或者,程序点Y经由程序X点可达,且程序点X可以后向控制可达程序点Y的其它对于共享量的定值。
[0114] 本实施例提供地指针分析方法,针对指针分析的结果,从共享量的定值点和引用点对的传播判断规则实现对程序中共享量指向集的补偿分析,补偿分析后获得针对程序中共享量更精确的分析结果;进一步地,本发明实施例提供的方法中,先行获得多线程程序中所有的共享量,具体包括全局和局部共享量,基于已获得的上述共享量进行补偿分析,因此,仅通过进行一次补偿分析就可以获得程序中所有共享量被定值或/和引用的所有可能结果,更进一步地提高了指针分析的效率。
[0115] 实施例三
[0116] 图5为本发明实施例三所提供的一种指针分析装置的结构示意图。如图5所示,本实施例提供的指针分析装置,具体包括:读取模块11,指针分析模块12和补偿分析模块13。
[0117] 其中,读取模块11,用于读取待分析的多线程程序中的语句信息;
[0118] 指针分析模块12,用于根据读取模块11读取的所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;
[0119] 补偿分析模块13,用于根据指针分析模块12获得的所述程序的共享信息对所述共享量进行补偿分析。
[0120] 本发明实施例提供的指针分析装置用于执行本发明实施例一提供的指针分析方法,具备相应的功能模块,其实现原理和技术效果类似,此处不再赘述。
[0121] 可选地,图6为本发明实施例所提供的一种指针分析装置的结构示意图,在上述图5所示装置的基础上,本实施例提供的指针分析装置,还包括:接收模块14,用于在读取模块
11读取待分析的多线程程序中的语句信息之前,接收用户发送的指针分析指令;相应地,读取模块11,具体用于根据接收模块14接收的所述指针分析指令读取所述待分析的多线程程序中的语句信息。
[0122] 进一步地,本实施例提供的指针分析装置,还包括:优化模块15,用于在补偿分析模块13根据指针分析模块12获得的所述程序的共享信息对所述共享量进行补偿分析之后,采用所述补偿分析的结果,对所述程序进行优化处理。
[0123] 实施例四
[0124] 图7为本发明实施例四所提供的一种指针分析装置的结构示意图。如图7所示,本实施例提供的指针分析装置在图6所示装置结构的基础上,所述指针分析模块12,包括:程序分析单元16,用于根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;线程分析单元17,用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。
[0125] 本实施例在具体实现中,上述全局共享判断规则包括:若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。
[0126] 进一步地,本实施例提供的指针分析装置中,所述线程分析单元17,具体用于对程序中每个线程进行指针分析,获得每个线程中的指针指向集;并且根据全局共享量、指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;进而根据全局共享量、局部共享量和指针指向集对每个线程进行分析,获得与共享量对应的访存行为。
[0127] 需要说明的是,上述局部共享判断规则可以包括:若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则该变量为局部共享量。
[0128] 更进一步地,本实施例提供的指针分析装置中,所述线程分析单元17用于根据全局共享量、指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,具体包括:用于根据全局共享量、指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;并且根据可能逃逸的局部变量和共享传播规则,确定从可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。
[0129] 可选地,本实施例提供的指针分析装置还包括:图像生成模块18,用于在补偿分析模块13根据指针分析模块12获得的所述程序的共享信息对每个共享量分别进行补偿分析之前,根据程序的语句信息生成并行控制流图;并且根据该并行控制流图和共享信息生成针对程序的共享量访存图SAG;相应地,所述补偿分析模块13,具体用于根据图像生成模块18生成的SAG对共享量进行补偿分析。本实施例在具体实现时,上述共享量具有相应的定值点和引用点对;相应地,所述补偿分析模块13,包括:判断单元19,用于根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;传播单元20,用于将判断单元19获取的定值点和引用点对之间可以相互影响的共享量的定值点的指针指向集传播到对应的引用点。
[0130] 本发明实施例提供的指针分析装置用于执行本发明实施例二提供的指针分析方法,具备相应的功能模块,其实现原理和技术效果类似,此处不再赘述。
[0131] 实施例五
[0132] 图8为本发明实施例五所提供的一种终端设备的结构示意图。如图8所示,本实施例提供的终端设备,具体包括:处理器21和接收器22。
[0133] 其中,处理器21,用于读取待分析的多线程程序中的语句信息;
[0134] 所述处理器21,还用于根据所述程序的语句信息对所述程序进行指针分析,获得所述程序的共享信息,所述共享信息包括共享量、指针指向集和访存行为,其中,共享量包括全局共享量和局部共享量;
[0135] 所述处理器21,还用于根据所述程序的共享信息对所述共享量进行补偿分析。
[0136] 接收器22,用于在所述处理器21读取待分析的多线程程序中的语句信息之前,接收用户发送的指针分析指令;相应地,所述处理器21,具体用于根据接收器22接收的所述指针分析指令读取所述待分析的多线程程序中的语句信息。
[0137] 本发明实施例提供的终端设备用于执行本发明实施例一提供的指针分析方法,具备相应的实体装置,其实现原理和技术效果类似,此处不再赘述。
[0138] 进一步地,本实施例提供的终端设备,所述处理器21,还用于在根据所述程序的共享信息对所述共享量进行补偿分析之后,采用所述补偿分析的结果,对所述程序进行优化处理。
[0139] 实施例六
[0140] 请参考图8,也为本发明实施例六所提供的一种终端设备的结构示意图。本实施的终端设备结构与实施例五所提供的终端设备结构相同,但是模块功能不同,本实施例中:所述处理器21,具体用于根据全局共享判断规则对所述程序进行分析,获得所述程序中的全局共享量;并且对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为。
[0141] 本实施例在具体实现中,上述全局共享判断规则包括:若变量可以被程序中至少两个线程同时访问,则所述变量为全局共享量。
[0142] 进一步地,本实施例提供的终端设备中,所述处理器21用于对所述程序中每个线程进行指针分析,获得每个线程中的指针指向集、局部共享量和与所述共享量对应的访存行为,具体包括:用于对程序中每个线程进行指针分析,获得每个线程中的指针指向集;并且根据全局共享量、指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量;进而根据全局共享量、局部共享量和指针指向集对每个线程进行分析,获得与共享量对应的访存行为。
[0143] 需要说明的是,上述局部共享判断规则可以包括:若给定线程中变量可以作为所述程序中某个线程的入口参数而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过被全局共享量间接引用的方式而被其他线程访问,则该变量为局部共享量;或者,若给定线程中变量可以通过全局共享量的赋值,使得所述变量的指向集包含所述全局共享量,则该变量为局部共享量。
[0144] 更进一步地,本实施例提供的终端设备中,所述处理器21用于根据全局共享量、指针指向集和局部共享判断规则对每个线程进行分析,获得每个线程中的局部共享量,具体包括:用于根据全局共享量、指针指向集和局部共享识别规则,获取每个线程中可能逃逸的局部变量;并且根据可能逃逸的局部变量和共享传播规则,确定从可能逃逸的局部变量中获取的可能被其他线程使用的局部变量为局部共享量。
[0145] 可选地,本实施例提供的终端设备,所述处理器21,还用于在根据程序的共享信息对每个共享量分别进行补偿分析之前,根据程序的语句信息生成并行控制流图;并且根据该并行控制流图和共享信息生成针对程序的共享量访存图SAG;相应地,所述处理器21用于根据所述程序的共享信息对所述共享量进行补偿分析,具体包括:用于根据SAG对共享量进行补偿分析。本实施例在具体实现时,上述共享量具有相应的定值点和引用点对;相应地,所述处理器21用于根据所述程序的共享信息对所述共享量进行补偿分析,具体包括:用于根据传播判断规则获得所述定值点和引用点对之间可以相互影响的共享量;并将定值点和引用点对之间可以相互影响的共享量的定值点的指针指向集传播到对应的引用点。
[0146] 本发明实施例提供的终端设备用于执行本发明实施例二提供的指针分析方法,具备相应的实体装置,其实现原理和技术效果类似,此处不再赘述。
[0147] 本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0148] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。