CN101566968A - 一种检查源代码中空指针的方法和计算机系统 - Google Patents
一种检查源代码中空指针的方法和计算机系统 Download PDFInfo
- Publication number
- CN101566968A CN101566968A CNA2009102037029A CN200910203702A CN101566968A CN 101566968 A CN101566968 A CN 101566968A CN A2009102037029 A CNA2009102037029 A CN A2009102037029A CN 200910203702 A CN200910203702 A CN 200910203702A CN 101566968 A CN101566968 A CN 101566968A
- Authority
- CN
- China
- Prior art keywords
- variable
- tabulation
- source code
- initializtion
- global
- 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.)
- Granted
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本申请公开了一种检查源代码中空指针的方法,包括:计算机系统构造可引用变量类型字典,计算机系统接收扫描空指针的指令,格式化待检查的源代码;扫描待检查源代码的全局代码区域,获得与所述字典中变量声明类型对应的未初始化全局变量列表;扫描所述待检查源代码的方法区域,获得与所述字典中变量声明类型对应的未初始化局部变量列表;根据未初始化全局变量列表,获取方法下未初始化全局变量列表;扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。本申请还公开了一种计算机系统。
Description
技术领域
本申请涉及空指针检测技术领域,特别涉及一种检查源代码中空指针的方法和计算机系统。
背景技术
在计算机程序中,具有不定值的指针会随机产生数值,不知道指向什么地方的指针,或指针指向超出范围的指针是很危险的,因为这种不确定因素可以使程序陷入瘫痪,因此要定义一个空值针将这些不定因素装进去。这种空值针也就是通常所说的空指针。
下面以JAVA语言为例,提供一个简单的空指针的例子:
//Hello.java的源代码
import com.xx.Bye;
public class Hello{
private Integer num1; //声明一个整型的指针num1
private Bye bye;
public int getNum(){
return num 1.intValue(); //调用指针num1
}
}
从上面的例子可以看出,在第4行声明了一个类型为整型(Integer)的指针,该指针名称为num1,在第7行调用了该指针num1,而在对该指针声明之后,调用之前,并没有对该num1指针进行初始化,因而在运行中会造成一个典型的空指针异常。
目前,由于空指针异常而使一个程序项目如JAVA项目存在程序缺陷(bug)的情况非常常见,现有技术主要通过白盒测试和黑盒测试来检测一个JAVA项目中是否存在异常的空指针。
白盒测试是指已知产品的内部工作过程,通过测试来证明内部每种操作是否符合设计规格要求,所有内部成分是否以经过检查。白盒测试要写大量的测试用例,如果测试用例覆盖度不足,白盒测试的效果也不好。
黑盒测试是指已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。黑盒测试是通过功能测试来查找问题,并且要界定bug的责任人,只能通过人工判断。Bug描述和邮件通知也要消耗人力沟通成本。
此外一些开源的静态源码分析工具,如findbugs,也可以扫描程序代码中的空指针异常情况,但是会存在很多的问题:
1.许多情况下的空指针问题扫描不出。
现有开源的静态源码分析工具,如findbugs,只检查程序代码中的全局变量、局部变量等空指针情况,而对于程序代码中涉及方法(“方法”是包含一系列语句的代码块。程序通过“调用”方法并指定所需的任何方法参数来执行语句。)参数的空指针不做检测,因而,许多情况下的空指针问题扫描不出。
此外,由于程序不稳定,代码解析过程复杂易出错等问题,也经常导致空指针问题扫描不出。
2.扫描工具比较庞大,扫描速度慢。
由于findbugs不是专门的空指针扫描器,其还扫描很多其他的东西,虽然可配置,但是毕竟代码设计冗余,扫描速度比较慢。
3.编译后才能扫描。
现有的findbugs往往需要代码编译完以后,才能进行扫描,因为它是以字节码为主进行扫描,不能扫描源码,因而需要编译,而编译比较麻烦,准备时间多,程序开发的精神相悖。
4.现有用于空指针扫描工具所采用的算法比较落后,其构造了大量的复杂的正则表达式列表,循环递归调用正则表达式,对CPU等资源占用非常大。
发明内容
本申请实施例提供一种检查源代码中空指针的方法和计算机系统,不但能全面、准确、快速地扫描出异常空指针,且在扫描前不需要对程序代码进行编译,算法先进,避免占用大量资源。
为实现上述目的,本申请提供了一种检查源代码中空指针的方法,计算机系统构造可引用变量类型字典,所述可引用变量类型字典中包括各种类型的变量声明,该方法还包括:
计算机系统接收扫描空指针的指令,格式化待检查的源代码;
扫描所述待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;
扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;
根据未初始化全局变量列表,获取方法下未初始化全局变量列表;
扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
其中,查找到空指针后,进一步包括:记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
其中,所述方法进一步包括:根据所述空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息,根据该提交人的信息中的联系信息通知该提交人存在空指针。
其中,所述计算机系统格式化待检查源代码的步骤包括:
计算机系统让待检查源代码中的目标关键字的左右各出现一个空格;
所述目标关键字至少包括:JAVA关键字、变量名和方法调用。
其中,所述扫描待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表的步骤包括:
将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;
在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在全局代码区域匹配得到的所有变量名得到全局变量列表;
再次扫描所述全局代码区域,如果未出现对所述全局变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化全局变量列表。
其中,扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表的步骤包括:
将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;
在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在该方法区域匹配得到的所有变量名得到局部变量列表;
根据所述局部变量列表得到未初始化局部变量列表。
其中,根据所述局部变量列表得到未初始化局部变量列表的步骤包括:
构建一个局部变量列表哈希地图,该哈希地图的关键值key是各个方法区域的方法名称,值value是该方法下的局部变量列表;
扫描待检查源代码中的方法区域,如果在方法区域内未出现对该方法区域内局部变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化局部变量列表;
构建一个未初始化局部变量列表哈希地图,该哈希地图的关键值key是方法区域的方法名称,值value是该方法下的未初始化局部变量列表。
其中,根据未初始化全局变量列表,获取方法下未初始化全局变量列表的步骤包括:
扫描待检查源代码中的方法区域,如果在方法区域内未出现对未初始化全局变量列表的变量名进行赋值的语句,则记录该未被赋值的变量名,获得方法下未初始化全局变量列表。
其中,所述查找被调用的变量名的步骤包括:
查找待检查源代码的方法区域中的调用点,是否存在字符串为“变量名.”的字符串,若存在,则该“变量名.”字符串中的变量名即为被调用的变量名。
其中,所述计算机系统接收到扫描空指针的指令,由用户发起,或者由计算机系统内定时发起。
本申请还提供了一种检查源代码中空指针的计算机系统,包括:
可引用变量类型字典构造模块,用于构造可引用变量类型字典,所述可引用变量类型字典中包括各种类型的变量声明;
格式化模块,用于格式化待检查的源代码;
第一获取模块,用于扫描所述待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;
第二获取模块,用于扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;
第三获取模块,用于根据未初始化全局变量列表,获取方法下未初始化全局变量列表;
空指针获取模块,用于扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
其中,所述系统还包括:
空指针记录模块,用于记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
其中,所述系统还包括:通知单元,用于计算机系统查找该空指针的提交人信息,通知该提交人。
其中,所述通知单元包括:
提交人信息查找模块,用于根据所述空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息;
信息通知模块,用于根据该提交人的信息中的联系信息通知该提交人存在空指针。
应用本申请,不但扫描全局区域,还扫描各个方法区域,因而检查的很全面,由于本申请实施例不应用正则表达式,完全是基于构造的字典采用精确字符查找,因而算法先进,查找准确、快速,避免了占用大量资源查找性能高,且本申请实施例提供的方法不需要对程序代码进行编译,因而避免了由于编译所产生的不稳定、异常等问题。
再有应用本申请,计算机系统会自动更新最新的项目源代码,运行检查任务,做到项目源代码提交后,迅速发现空指针,立刻通知、提醒责任人,以利于在第一时间改掉由于空指针所造成的程序缺陷bug。本申请实施例可以根据需要随时执行且便于集成至任何计算机系统,因而不但应用简单、效果明显且成本低。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本申请实施例的检查源代码中空指针的方法流程图;
图2是根据本申请实施例的检测控制针并通知的流程图;
图3是根据本申请实施例的检查源代码中空指针的计算机系统结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为了更清楚的说明本申请,下面先对现有的一些概念做简单介绍。
变量是指在程序的运行过程中随时可以发生变化的量。变量是程序中数据的临时存放场所。简而言之,变量是用于跟踪几乎所有类型信息的简单工具。
全局变量,它们是在整个程序中都可见的。
局部变量,他们是在方法内部定义的变量,作用域为定义局部变量的方法,也就是说他只能在定义他的方法中使用,即一个方法内的局部变量在其他方法内是不起作用的。
方法,是包含一系列语句的代码块,通过调用方法并指定所需的方法参数来执行语句。
变量声明,是声明变量的一种方式,即用于指示一个变量的数据类型。
参见图1,其是根据本申请实施例的检查源代码中空指针的方法流程图。本实施例以JAVA语言为例,具体包括以下步骤:
步骤101,计算机系统接收扫描空指针的指令,构造可引用变量类型字典,该可引用变量类型字典中包括各种类型的变量声明。
本步骤就是构造本JAVA类中,已经输入(import)过的JAVA类型,或无需import就可以使用的JAVA类型的列表,以及上述JAVA类型的构造方法的列表,具体构造方法如下:
首先产生在JAVA文件无需import就能调用到的类(如JAVA的lang包下的基本类型,eg.Integer,如位于同一个包下的类等等)的列表;
然后扫描此JAVA文件的头及被继承文件的JAVA文件头import声明区块,生成需要import的调用类型的列表;
合并上述两个列表,产生可引用变量类型字典。
需要说明的是,如果此JAVA文件中的类是继承自其他类,还要递归父类,父类的源码中的可用类型,并合并入本字典中。
一个简单的可引用变量类型字典的形式可如表1所示:
表1
IntegerDoubleFloat……中间略去n行……HelloHalloByeGoodManBadDog |
该可引用变量类型字典将作为后面来匹配JAVA源代码的基础,从而找出未初始化的变量,找到造成空指针的异常代码块。
步骤102,计算机系统格式化待检查的源代码。
这里,可以采用JDT格式化工具,格式化源代码,使得源代码格式工整,以利于源代码的扫描。具体格式化的方式可以是:
计算机系统让待检查源代码中的目标关键字的左右各出现一个空格,以便于后续通过空格来进行分词,然后将分词所得的字符串,与所述字典进行匹配。上述目标关键字至少包括:JAVA关键字、变量名和方法调用。
例如,将变量声明,方法调用两侧的多个空格格式化成单个空格等等,其目标是让每个JAVA关键字,变量名,方法调用等的左右都出现各一个空格。
步骤103,扫描待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;具体实现步骤如下:
i)将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;
其中,对于一一匹配的方法,由于需要待检查源代码中全局代码区域的全部代码一一匹配,因而速度较慢、匹配次数多,性能相对较差。
对于采用字符串哈希算法的匹配方式,速度快,性能相对较好。下面具体说明该匹配方式:
对可引用变量类型字典进行分组,分组策略是,根据字典中字符串的首字符,尾字符,和字符串的长度这三个关键信息,取得摘要,作为哈希地图(hashmap)的关键字(key),值(value)则是满足此摘要的字典中所有字符串所组成的链表,根据本应用的实际情况(字典的长度有限),通常每个链表中只有一个字符串。比如字典中有一个Integer字符串,它的key就是Ir7。根据上述分组策略,会得到字典的hashmap。例如,对于表1所示字典的hashmap如表2所示:
表2
这样,只要将待检查源代码的字符串的摘要信息,与字典hashmap的key进行匹配查找,如果key匹配失败,则肯定匹配不到,直接匹配失败。如果key匹配成功,则和hashmap中该key对应的链表中的各字符串进行匹配,根据本应用的实际情况,通常该链表中只有一个字符串,因为首字符和尾字符已经肯定是一致了,所以只要匹配中间的字符就可以了,通常可以从第二个字符开始比对,只要出现不一致,就立刻break,直接匹配失败,如果首字母和尾字母之间的字符全部匹配上,则匹配成功。
例如,假设待匹配字符串为Hello,那么它的第一字符为H,最后一个字符为o,字符串长度为5,组成key为Ho5,去匹配字典的hashmap(假设就是表2),找到key为Ho5的value为 “Hello,Hallo”的列表,匹配该列表,匹配到该列表的第一个值正好就是Hello,所以说明待匹配字符串存在于字典中,匹配成功。
这样,依据上述方式,应用待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型进行匹配,即可获得与所述可引用变量类型字典中变量声明类型对应的变量声明。
ii)在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在全局代码区域匹配得到的所有变量名得到全局变量列表;
例如,待检查源代码中,有一句:Integer num1=new Integer(1);其中斜体字部分是匹配到可引用变量类型字典中的“Integer”类型,在该匹配项的下一个空格和下一个等号或分号之间,可以获得一个变量名,在本例子中得到了加下划线的部分“num1”,然后将该变量名放到全局变量列表(global_list)中。
一个全局变量列表的例子如表3所示:
表3
全局变量1 |
全局变量2 |
全局变量3 |
…… |
全局变量n |
iii)再次扫描所述全局代码区域,如果未出现对所述全局变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化全局变量列表。
具体的,如果在全局代码区没有出现“变量名=”这样的赋值语句,那么该变量名被暂定为未初始化全局变量。例如,如果在全局代码区域没有出现“num1=”这样的字符串,则num1这个全局变量被暂定为未初始化全局变量,说明该变量在全局代码区未初始化,则将num1放入未初始化全局变量列表(uninitialize_global_list)。
一个未初始化全局变量列表的例子如表4所示:
表4
全局变量1 |
全局变量3 |
全局变量n |
步骤104,依次扫描所述待检查源代码的每个方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;具体实现步骤如下:
i)将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;具体的采用字符串哈希算法的匹配方式与前述相同,不再重复说明。
ii)在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在该方法区域匹配得到的所有变量名得到局部变量列表;一个局部变量列表的例子如表5所示:
表5
局部变量1 |
局部变量2 |
局部变量3 |
…… |
局部变量n |
iii)重复上述步骤,依次扫描所述待检查源代码的每个方法区域,得到每个方法区域的局部变量列表;
iv)构建一个局部变量列表哈希地图,该哈希地图的关键值key是各个方法区域的方法名称,值value是该方法下的局部变量列表;一个局部变量列表hashmap的例子如表6所示:
表6
v)再次扫描待检查源代码中各个方法区域,如果在各个方法区域内未出现对该方法区域内局部变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化局部变量列表;
例如,一个未初始化局部变量列表的例子如表7所示:
表7
局部变量1 |
局部变量3 |
局部变量n |
vi)构建一个未初始化局部变量列表哈希地图,该哈希地图的关键值key是各个方法区域的方法名称,值value是该方法下的未初始化局部变量列表。
例如,一个局部变量列表hashmap的例子如表8所示:
表8
步骤105,根据未初始化全局变量列表,获取方法下未初始化全局变量列表。
具体的,扫描待检查源代码中各个方法区域,如果在各个方法区域内未出现对未初始化全局变量列表的变量名进行赋值的语句,则记录该未被赋值的变量名,获得方法下未初始化全局变量列表。
也就是说,如果在某个方法区域内,定义了一个未初始化全局变量,则该全局变量在该方法区域内就是已经被初始化了的,例如,在表4的基础上,一个方法下未初始化全局变量列表的例子如表9所示:
表9
全局变量1 |
全局变量n |
步骤106,依次扫描所述待检查源代码的每个方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
具体的,查找被调用的变量名的步骤包括:查找待检查源代码的所有方法区域中的调用点,是否存在字符串为“变量名.”的字符串,若存在,则该“变量名.”字符串中的变量名即为被调用的变量名。如果该查找到的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,则该查找到的被调用的变量名即为源代码中的空指针,将该找到的空指针放入空指针列表(npe_list)。
至此,找到了源代码中空指针。
查找到空指针后,可以进一步包括:记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
对于图1所示实施例,即可以由计算机系统通过单线程执行完成,也可以通过多线程来实现,以达到更高的扫描速度。
对于图1所示实施例,步骤101中计算机系统所接收到的扫描空指针的指令既可以由用户发起,也可以是计算机系统内定时发起的,例如,可以将上述检查空指针的操作作为定时任务,在windows操作系统中,作为“计划任务”定时运行,在linux中,可以放在crontab中,定时运行,所谓定时,是指比如,在每天的某个时间点,或者每隔一个小时运行一次。
应用本申请实施例提供的方法,不但扫描全局区域,还扫描各个方法区域,因而检查的很全面,由于本申请实施例不应用正则表达式,完全是基于构造的字典采用精确字符查找,因而算法先进,查找准确、快速,避免了占用大量资源查找性能高,且本申请实施例提供的方法不需要对程序代码进行编译,因而避免了由于编译所产生的不稳定、异常等问题。
参见图2,其是根据本申请实施例的检测空指针并通知的流程图。具体包括:
步骤201,计算机系统接收源代码检测或更新指令,自动检测(checkout)或更新(update)项目源代码。
上述指令可以包括:用户所选择的源码版本管理系统,用户输入的项目分支号以及版本号以及用户所选择的重新checkout代码还是仅仅更新项目源代码等。
步骤202,扫描待检查源代码,查询空指针,获得空指针列表。该空指针列表中包括空指针所在的行号以及变量名。
该步骤的具体执行过程如图1所述,此处不再赘述。
步骤203,遍历所述空指针列表中的空指针,根据每个空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息。
步骤204,根据版本号依次区分每个空指针是本次项目分支所产生的空指针,还是历史遗留空指针,若是本次项目分支所产生的,则执行步骤205,若是历史遗留的则执行步骤207。
步骤205,将本次项目分支所产生的空指针存入项目空指针结果文件,该项目空指针结果文件可以以一个列表的形式存在,可以包括空指针的变量名、以及该空指针的提交人信息。
步骤206,根据提交人信息中的联系信息,通知每个提交人。结束。
具体的,可以通过邮件的方式通知具体负责人,告知其存在空指针的具体信息如行号等。
步骤207,将历史遗留的指针存入历史空指针结果文件,结束。
应用本申请实施例,计算机系统会自动更新最新的项目源代码,运行检查任务,做到项目源代码提交后,迅速发现空指针,立刻通知、提醒责任人,以利于在第一时间改掉由于空指针所造成的程序缺陷bug。本申请实施例可以根据需要随时执行且便于集成至任何计算机系统,因而不但应用简单、效果明显且成本低。
本申请实施例还提供了一种检查源代码中空指针的计算机系统,参见图3,包括:
可引用变量类型字典构造模块301,用于构造可引用变量类型字典,所述可引用变量类型字典中包括各种类型的变量声明;
格式化模块302,用于格式化待检查的源代码;
第一获取模块303,用于扫描所述待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;
第二获取模块304,用于扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;
第三获取模块305,用于根据未初始化全局变量列表,获取方法下未初始化全局变量列表;
空指针获取模块306,用于扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
上述各个模块的具体执行过程参见相关方法部分的描述,此处不再赘述。
应用本申请实施例提供的计算机系统,不但扫描全局区域,还扫描各个方法区域,因而检查的很全面,由于本申请实施例不应用正则表达式,完全是基于构造的字典采用精确字符查找,因而算法先进,查找准确、快速,避免了占用大量资源查找性能高,且本申请实施例提供的方法不需要对程序代码进行编译,因而避免了由于编译所产生的不稳定、异常等问题。
对于图3所示计算机系统还可以包括:
空指针记录模块,用于记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
对于图3所示计算机系统还可以包括:
通知单元,用于计算机系统查找该空指针的提交人信息,通知该提交人。
上述通知单元可以包括:
提交人信息查找模块,用于根据所述空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息;
信息通知模块,用于根据该提交人的信息中的联系信息通知该提交人存在空指针。
应用本申请实施例,计算机系统会自动更新最新的项目源代码,运行检查任务,做到项目源代码提交后,迅速发现空指针,立刻通知、提醒责任人,以利于在第一时间改掉由于空指针所造成的程序缺陷bug。本申请实施例可以根据需要随时执行且便于集成至任何计算机系统,因而不但应用简单、效果明显且成本低。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
上述计算机系统具体可以由服务器实体实现,或者由具有某种功能的产品来实现。
为了描述的方便,描述计算机系统时是以功能分为各种模块分别描述。当然,在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
以上所述仅为本申请的较佳实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本申请的保护范围内。
Claims (14)
1、一种检查源代码中空指针的方法,其特征在于,计算机系统构造可引用变量类型字典,所述可引用变量类型字典中包括各种类型的变量声明,该方法还包括:
计算机系统接收扫描空指针的指令,格式化待检查的源代码;
扫描所述待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;
扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;
根据未初始化全局变量列表,获取方法下未初始化全局变量列表;
扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
2、根据权利要求1所述的方法,其特征在于,查找到空指针后,进一步包括:记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
3、根据权利要求2所述的方法,其特征在于,所述方法进一步包括:根据所述空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息,根据该提交人的信息中的联系信息通知该提交人存在空指针。
4、根据权利要求1所述的方法,其特征在于,所述计算机系统格式化待检查源代码的步骤包括:
计算机系统让待检查源代码中的目标关键字的左右各出现一个空格;
所述目标关键字至少包括:JAVA关键字、变量名和方法调用。
5、根据权利要求4所述的方法,其特征在于,所述扫描待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表的步骤包括:
将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中全局代码区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;
在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在全局代码区域匹配得到的所有变量名得到全局变量列表;
再次扫描所述全局代码区域,如果未出现对所述全局变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化全局变量列表。
6、根据权利要求4所述的方法,其特征在于,扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表的步骤包括:
将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型一一匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明,或者,采用字符串哈希算法将待检查源代码中一个方法区域的变量声明与所述字典中变量声明的类型进行匹配,获得与所述可引用变量类型字典中变量声明类型对应的变量声明;
在该匹配到的变量声明项的下一个空格和下一个等号或分号之间,得到一个变量名,记录在该方法区域匹配得到的所有变量名得到局部变量列表;
根据所述局部变量列表得到未初始化局部变量列表。
7、根据权利要求6所述的方法,其特征在于,根据所述局部变量列表得到未初始化局部变量列表的步骤包括:
构建一个局部变量列表哈希地图,该哈希地图的关键值key是各个方法区域的方法名称,值value是该方法下的局部变量列表;
扫描待检查源代码中的方法区域,如果在方法区域内未出现对该方法区域内局部变量列表中的变量名进行赋值的语句,则记录该未被赋值的变量名,获得未初始化局部变量列表;
构建一个未初始化局部变量列表哈希地图,该哈希地图的关键值key是方法区域的方法名称,值value是该方法下的未初始化局部变量列表。
8、根据权利要求5所述的方法,其特征在于,根据未初始化全局变量列表,获取方法下未初始化全局变量列表的步骤包括:
扫描待检查源代码中的方法区域,如果在方法区域内未出现对未初始化全局变量列表的变量名进行赋值的语句,则记录该未被赋值的变量名,获得方法下未初始化全局变量列表。
9、根据权利要求1所述的方法,其特征在于,所述查找被调用的变量名的步骤包括:
查找待检查源代码的方法区域中的调用点,是否存在字符串为“变量名.”的字符串,若存在,则该“变量名.”字符串中的变量名即为被调用的变量名。
10、根据权利要求1所述的方法,其特征在于,所述计算机系统接收到扫描空指针的指令,由用户发起,或者由计算机系统内定时发起。
11、一种检查源代码中空指针的计算机系统,其特征在于,包括:
可引用变量类型字典构造模块,用于构造可引用变量类型字典,所述可引用变量类型字典中包括各种类型的变量声明;
格式化模块,用于格式化待检查的源代码;
第一获取模块,用于扫描所述待检查源代码的全局代码区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化全局变量列表;
第二获取模块,用于扫描所述待检查源代码的方法区域,获得与所述可引用变量类型字典中变量声明类型对应的未初始化局部变量列表;
第三获取模块,用于根据未初始化全局变量列表,获取方法下未初始化全局变量列表;
空指针获取模块,用于扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。
12、根据权利要求11所述的计算机系统,其特征在于,所述系统还包括:
空指针记录模块,用于记录所述空指针所对应的变量名和该变量名所在代码的行号,存放入已建立的空指针列表。
13、根据权利要求12所述的计算机系统,其特征在于,所述系统还包括:
通知单元,用于计算机系统查找该空指针的提交人信息,通知该提交人。
14、根据权利要求13所述的计算机系统,其特征在于,所述通知单元包括:
提交人信息查找模块,用于根据所述空指针所在的行号以及所处的源码文件,在项目源码管理系统的日志中查找该空指针的提交人信息;
信息通知模块,用于根据该提交人的信息中的联系信息通知该提交人存在空指针。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102037029A CN101566968B (zh) | 2009-05-20 | 2009-05-20 | 一种检查源代码中空指针的方法和计算机系统 |
HK10104107.0A HK1137245A1 (en) | 2009-05-20 | 2010-04-27 | Method for checking null pointer in source codes and computer system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102037029A CN101566968B (zh) | 2009-05-20 | 2009-05-20 | 一种检查源代码中空指针的方法和计算机系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101566968A true CN101566968A (zh) | 2009-10-28 |
CN101566968B CN101566968B (zh) | 2012-07-04 |
Family
ID=41283126
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009102037029A Expired - Fee Related CN101566968B (zh) | 2009-05-20 | 2009-05-20 | 一种检查源代码中空指针的方法和计算机系统 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101566968B (zh) |
HK (1) | HK1137245A1 (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102567207A (zh) * | 2012-01-14 | 2012-07-11 | 惠州市德赛西威汽车电子有限公司 | 一种嵌入式系统的调试方法及其调试装置 |
CN103257919A (zh) * | 2012-02-21 | 2013-08-21 | 腾讯科技(深圳)有限公司 | 脚本程序检查方法和装置 |
CN105677559A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN107729235A (zh) * | 2017-09-29 | 2018-02-23 | 百度在线网络技术(北京)有限公司 | 定位代码缺陷生产者的方法、装置、设备及计算机可读介质 |
CN108062273A (zh) * | 2016-11-08 | 2018-05-22 | 阿里巴巴集团控股有限公司 | 一种程序的优化方法及装置 |
CN110188029A (zh) * | 2019-03-15 | 2019-08-30 | 中山大学 | 一种基于定值到达分析方法的Java空指针分析系统 |
CN111813654A (zh) * | 2020-05-28 | 2020-10-23 | 平安科技(深圳)有限公司 | 一种测试案例的引用方法及装置 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10296311B2 (en) | 2015-11-25 | 2019-05-21 | International Business Machines Corporation | Finding uninitialized variables outside the local scope |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6311327B1 (en) * | 1998-03-02 | 2001-10-30 | Applied Microsystems Corp. | Method and apparatus for analyzing software in a language-independent manner |
-
2009
- 2009-05-20 CN CN2009102037029A patent/CN101566968B/zh not_active Expired - Fee Related
-
2010
- 2010-04-27 HK HK10104107.0A patent/HK1137245A1/xx not_active IP Right Cessation
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102567207A (zh) * | 2012-01-14 | 2012-07-11 | 惠州市德赛西威汽车电子有限公司 | 一种嵌入式系统的调试方法及其调试装置 |
CN102567207B (zh) * | 2012-01-14 | 2016-05-11 | 惠州市德赛西威汽车电子股份有限公司 | 一种嵌入式系统的调试方法及其调试装置 |
CN103257919A (zh) * | 2012-02-21 | 2013-08-21 | 腾讯科技(深圳)有限公司 | 脚本程序检查方法和装置 |
CN103257919B (zh) * | 2012-02-21 | 2015-05-13 | 腾讯科技(深圳)有限公司 | 脚本程序检查方法和装置 |
CN105677559A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN105677559B (zh) * | 2015-12-31 | 2018-05-11 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN108062273A (zh) * | 2016-11-08 | 2018-05-22 | 阿里巴巴集团控股有限公司 | 一种程序的优化方法及装置 |
CN107729235A (zh) * | 2017-09-29 | 2018-02-23 | 百度在线网络技术(北京)有限公司 | 定位代码缺陷生产者的方法、装置、设备及计算机可读介质 |
CN107729235B (zh) * | 2017-09-29 | 2020-11-13 | 百度在线网络技术(北京)有限公司 | 定位代码缺陷生产者的方法、装置、设备及计算机可读介质 |
CN110188029A (zh) * | 2019-03-15 | 2019-08-30 | 中山大学 | 一种基于定值到达分析方法的Java空指针分析系统 |
CN111813654A (zh) * | 2020-05-28 | 2020-10-23 | 平安科技(深圳)有限公司 | 一种测试案例的引用方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
HK1137245A1 (en) | 2010-07-23 |
CN101566968B (zh) | 2012-07-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101566968B (zh) | 一种检查源代码中空指针的方法和计算机系统 | |
CN111367886B (zh) | 数据库中数据迁移的方法及装置 | |
US8782609B2 (en) | Test failure bucketing | |
US20050066263A1 (en) | System and method for generating data validation rules | |
CN107357593A (zh) | 源代码文件组建方法、装置、电子终端及可读存储介质 | |
CN111125116B (zh) | 定位业务表中代码字段及对应代码表的方法及系统 | |
Cleve et al. | Dynamic program analysis for database reverse engineering | |
CN103955429B (zh) | 确定回归测试范围的方法及装置 | |
Emam et al. | Inferring extended probabilistic finite-state automaton models from software executions | |
CN113434542B (zh) | 数据关系识别方法、装置、电子设备及存储介质 | |
CN113687827B (zh) | 基于微件的数据列表生成方法、装置、设备及存储介质 | |
CN114756868A (zh) | 一种基于指纹的网络资产与漏洞关联方法及装置 | |
CN105573763A (zh) | 一种支持rtos的嵌入式系统建模方法 | |
CN113032256A (zh) | 自动化测试方法、装置、计算机系统和可读存储介质 | |
US7171656B2 (en) | Generic embedded application technology architecture | |
Qi et al. | Dynamically relative position encoding-based transformer for automatic code edit | |
CN115033489A (zh) | 代码资源检测方法、装置、电子设备及存储介质 | |
CN104881455B (zh) | 一种基于mysql的结构差异处理方法及系统 | |
US20200409905A1 (en) | Method of Generating At-Scale Geospatial Features of Designated Attribution and Geometry | |
CN114880673A (zh) | 针对小程序源代码进行隐私数据泄露检测的方法及系统 | |
Ledmi et al. | Mining association rules for classification using frequent generator itemsets in arules package | |
Wang et al. | Formalism for detecting version differences in data models | |
Pande et al. | Design patterns discovery in source code: Novel technique using substring match | |
KR102523329B1 (ko) | 전력 개선을 위해 소프트웨어 소스 코드 변경하고 성능 개선 요소를 시각적으로 가시화하여 표시하는 방법 | |
Stephan et al. | Model clone detection and its role in emergent model pattern mining |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1137245 Country of ref document: HK |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1137245 Country of ref document: HK |
|
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120704 Termination date: 20190520 |