CN105607990A - 一种空指针崩溃的挖掘方法及装置 - Google Patents

一种空指针崩溃的挖掘方法及装置 Download PDF

Info

Publication number
CN105607990A
CN105607990A CN201410664753.2A CN201410664753A CN105607990A CN 105607990 A CN105607990 A CN 105607990A CN 201410664753 A CN201410664753 A CN 201410664753A CN 105607990 A CN105607990 A CN 105607990A
Authority
CN
China
Prior art keywords
code
dangerous
variable
function
null pointer
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
Application number
CN201410664753.2A
Other languages
English (en)
Other versions
CN105607990B (zh
Inventor
董杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Chengdu Co Ltd
Original Assignee
Tencent Technology Chengdu Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Chengdu Co Ltd filed Critical Tencent Technology Chengdu Co Ltd
Priority to CN201410664753.2A priority Critical patent/CN105607990B/zh
Publication of CN105607990A publication Critical patent/CN105607990A/zh
Application granted granted Critical
Publication of CN105607990B publication Critical patent/CN105607990B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)
  • Medical Treatment And Welfare Office Work (AREA)

Abstract

本发明实施例公开了一种空指针崩溃的挖掘方法,及装置,其中方法的实现包括:获取全量代码文件内返回空指针的函数;获取待挖掘的代码中使用了所述空指针的变量作为危险变量;使用所述危险变量进行前向搜索,若搜索得到使用了所述危险变量的代码行,并且所述代码行未进行判空保护,则确定所述代码行为产生空指针崩溃的代码行。首先确定返回空指针的函数,然后通过返回空指针函数被使用的情况确定危险变量,然后通过危险变量定位到产生空指针崩溃的代码行。可以准确找出会导致软件崩溃的空指针。

Description

一种空指针崩溃的挖掘方法及装置
技术领域
本发明涉及计算机技术领域,特别涉及一种空指针崩溃的挖掘方法,及装置。
背景技术
空指针崩溃是指软件程序中如果直接使用空指针变量的一个属性方法则会引起软件崩溃(Crash)。空指针是指针的一种,指针是指值为内存地址的一种变量,空指针则是内存地址为空(NULL)的指针变量。
空指针崩溃代码,是指使用空指针变量的代码行。因此,空指针崩溃代码存在引起软件崩溃的风险,为了避免这种风险,通常需要通过判空保护来避免软件崩溃。判空保护的过程是:判断指针变量的值是否等于NULL,如果指针变量值等于NULL时,就不使用该指针变量,如果不等于NULL则可以使用该指针变量。
空指针崩溃挖掘是在代码中找出会导致软件崩溃的空指针的过程,目前有实现该功能的工具软件,如CPPcheck工具,其挖掘方法如下:遇到函数会返回指针变量的代码行,则判断该代码行是否有判空保护,如果没有判空保护,则给该代码行报空指针崩溃代码告警。
由于CPPcheck工具遇到函数会返回指针变量的代码行且没有判空保护的代码,就直接给该代码行报空指针崩溃代码告警。但是,如果函数返回值中没有返回NULL的代码实现,即使函数的使用者没有判空保护的代码,也不会产生指针变量为NULL的可能。因此,会导致大量的无效告警。目前,一些产品在使用CPPcheck工具进行空指针崩溃风险挖掘时常会爆出几百,几千甚至上万的告警,由于其误报的存在,导致人工无法对大量的告警进行分析。因此,采用CPPcheck工具进行空指针崩溃挖掘,误报率高。
发明内容
本发明实施例提供了一种空指针崩溃的挖掘方法,及装置,用于准确找出会导致软件崩溃的空指针。
一种空指针崩溃的挖掘方法,包括:
获取全量代码文件内返回空指针的函数;
获取待挖掘的代码中使用了所述空指针的变量作为危险变量;
使用所述危险变量进行前向搜索,若搜索得到使用了所述危险变量的代码行,并且所述代码行未进行判空保护,则确定所述代码行为产生空指针崩溃的代码行。
一种空指针崩溃的挖掘装置,包括:
函数获取单元,用于获取全量代码文件内返回空指针的函数;
变量获取单元,用于获取待挖掘的代码中使用了所述空指针的变量作为危险变量;
代码搜索单元,用于使用所述危险变量进行前向搜索;
危险确定单元,用于若搜索得到使用了所述危险变量的代码行,并且所述代码行未进行判空保护,则确定所述代码行为产生空指针崩溃的代码行。
从以上技术方案可以看出,本发明实施例具有以下优点:首先确定返回空指针的函数,然后通过返回空指针函数被使用的情况确定危险变量,然后通过危险变量定位到产生空指针崩溃的代码行。可以准确找出会导致软件崩溃的空指针。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例方法流程示意图;
图2为本发明实施例装置结构示意图;
图3为本发明实施例装置结构示意图;
图4为本发明实施例装置结构示意图;
图5为本发明实施例装置结构示意图;
图6为本发明实施例服务器结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明实施例提供了一种空指针崩溃的挖掘方法,如图1所示,包括:
101:获取全量代码文件内返回空指针的函数;
在本实施例中,全量代码可以就是待挖掘的代码,待挖掘的代码也可以仅是全量代码的一部分代码。全量代码用于确定返回空指针的函数,但是返回空指针的函数并不一定会造成空指针崩溃,因此获取全量代码文件内返回空指针的函数作为空指针崩溃的挖掘前期准备。
102:获取待挖掘的代码中使用了上述空指针的变量作为危险变量;
在本实施例中,找到危险变量是为了确定使用了空指针的变量,危险变量是可能导致代码出现空指针崩溃的变量,但是并不一定会产生空指针崩溃,因此本发明实施例还需要进一步进行确认。
103:使用上述危险变量进行前向搜索,若搜索得到使用了上述危险变量的代码行,并且上述代码行未进行判空保护,则确定上述代码行为产生空指针崩溃的代码行。
在本发明实施例中,前向搜索的代码条数可以人为限定,也可以是对危险变量的生命周期所在的代码段进行前向搜索,前向搜索的条数本发明实施例不做唯一性限定。
在本实施例中,首先确定返回空指针的函数,然后通过返回空指针函数被使用的情况确定危险变量,然后通过危险变量定位到产生空指针崩溃的代码行。可以准确找出会导致软件崩溃的空指针。
即使使用了空指针,也并不代表一定会产生空指针崩溃,因此也不能认为是危险变量,因为有可能是并不会被执行的代码,例如:注释型代码。因此为了进一步提高挖掘空指针崩溃的代码的准确性,本实施例可以进一步地如下:在使用上述危险变量进行前向搜索之前还包括:
确定上述危险变量是否为注释型代码行,若不是,则使用上述危险变量进行前向搜索。
本发明实施例还给出了危险函数库模型的创建方案,用来提高查找危险变量的准确性,具体如下:上述获取全量代码文件内返回空指针的函数;包括:
获取全量代码文件内各函数中返回值类型为空的函数名;
将构造空指针的危险函数库模型,上述危险函数库模型的键值为:返回值类型为空的函数名以及返回值类型。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:上述方法还包括:
获取上述返回值类型为空的函数名所在代码的文件路径,以及从函数名开始到返回值为空的代码段,并记录到上述危险函数库模型。
基于本发明实施例给出的危险函数库模型,本发明实施例还提供了优选的确定危险变量的实现方案,如下:上述获取待挖掘的代码中使用了上述空指针的变量作为危险变量;包括:
获取上述待挖掘的代码中符合上述危险函数库模型的键值,并且使用了上述危险函数库模型中的函数赋值的变量,作为危险变量。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:在确定上述代码行为产生空指针崩溃的代码行之后,上述方法还包括:
获取上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
在确定了会产生空指针崩溃的代码行以后,还可以进行告警,告警的方式可以是现实空指针崩溃提示,提示的信息可以有多种形式,本发明实施例给出了优选的实现方式,如下:在获取上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径之后,上述方法还包括:
输出告警信息,并输出上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
以下实施例将给出以实际代码为例的举例说明,需要说明的是基于前述实施例的实现方式,可以针对的实际代码是很多的,并不限于以下举例,因此以下举例不应理解为对本发明实施例的唯一性限定。
本发明实施例的举例,基于返回值为returnNULL危险函数的核心思想算法可以主要分为三个步骤:
算法第一步:自动建立危险函数模型库
本步骤,需要针对产品的全量代码挖掘出所有返回值为returnNULL的函数,并提取关键信息存储到危险函数模型库。
在本步骤中需要自动建立危险函数模型库,关键信息主要涉及三个因子,后续将会对此进行详细说明。本步骤实现了可以跨文件的进行准确的函数是否会返回空指针的判断预警,具体如下:
基于一个C++语言和C语言函数定义风格的模式库,从产品的全量代码中自动匹配挖掘出符合模式库中某一种模式的危险函数,用于建立会100%产生空指针危险的危险函数库模型。
例如,下面的函数实现模式就会100%返回空指针:
那么,该危险函数库模型的结构如下:
因子1:函数名和函数返回值类型结对为关键key;
以上实例中,应为:getOutComeInfoByID&GLOutcomeInfo
因子2:函数名存在的代码文件路径;
因子3:函数名定义开始到遇到returnNULL模式的所有代码内容。
其中,因子1“函数名和函数返回值类型结对为关键索引”用于提高算法准确率,是本发明实施例的一个关键方法。
例如:
ClassA*RiskVar=RiskFun();
ClassB*RiskVar=RiskFun();
虽然以上两行代码的函数名都是RiskFun(),但是只有Class*ARiskFun();有returnNULL的实现,因此只有RiskFun()与ClassA成对出现时,才会是风险函数模式,RiskFun()与ClassB成对出现时,不是风险函数模式。因此,采用以上因子1是可以提高算法准确率的。
因子2和因子3用于加快空指针变量应用的代码定位。
算法第二步:危险变量提取功能
对指定代码(待挖掘的代码)基于危险变量识别模式模块进行危险变量提取,遇到第一个危险变量时,马上进行前向搜索算法。以下给出了危险变量的确定方案,如下:
对指定代码文件逐行进行代码行模式匹配,找到使用了空指针危险函数库中的函数赋值的危险变量RiskVar,再继续往前进行N行代码的前向搜索算法判断。(N目前为5,也可用户自定义)
GLOutcomeInfo*outCome=GLDataManager::Get()->getOutComeInfoByID(outID);
其中,outCome就是危险变量RiskVar;
危险变量的判断规则是:当该变量是由危险函数库中的危险函数赋值,且该变量的数据类型也是危险函数返回值的数据类型。
危险变量提取算法流程是:
1、是否该行代码为注释型代码?是,则跳过危变量提取。以避免对注释代码进行危险变量提取,产生误报数据;否,进入下一步;
2、如果代码行匹配到RiskClass*RiskVar=……RiskFun();模式,那么这时就先提取危险变量的返回值类型:RiskClass;危险变量名RiskVar;危险函数名RiskFun
3、把RiskClass与RiskFun组合成一个关键词key与算法第一步中危险函数数据库中的关键key进行匹配,如果匹配上了,就先预读从本行代码开始的下一批N行代码作为需要检查的风险代码块CheckRiskCode,与关键词key一起传递给算法第三步的前向搜索算法。
算法第三步:前向搜索算法
在代码中遇到危险变量后应用前向搜索算法,判断是否存在会发生空指针应用崩溃的代码行,具体实现如下:
逐行读取需要检查的风险代码块CheckRiskCode中的每行代码,如果在空指针判空保护模式代码出现前,出现了危险变量的应用模式RiskVar->,例如下面所示:outCome->speedUPItems为危险变量的应用。
GLOutcomeInfo*outCome=GLDataManager::Get()->getOutComeInfoByID(outID);
int64diamond=GLRuntimeData::Get()->DiamondInItems(outCome->speedUPItems);
那么就可以100%准确的判断使用危险变量的代码行会产生空指针崩溃的现象。
空指针判空保护模式集有:['!=NULL','==NULL','NULL!=',if(RiskVar),″if(RiskVar&&',while(RiskVar&&,if(RiskVar==NULL&&,等]。
下面是一个采用本发明实施例的算法自动生成的问题定位报告举例:
CrashNO.1**********空指针Crash风险**************
E:\webgame\project\qday_proj\client\GL_Project\Classes\Command\GLCommandImpl.cpp
【说明:以上是空指针代码出现的文件路径,下面是会发生空指针崩溃(crash)的代码块】
空指针Crash发生的代码块:[1742行~1743行]
GLOutcomeInfo*outCome=GLDataManager::Get()->getOutComeInfoByID(outID);
int64diamond=GLRuntimeData::Get()->DiamondInItems(outCome->speedUPItems);
【说明:下面是自动给出的辅助定位中文信息,即:为什么1743行会发生crash的原因】
CrashCode:1743int64diamond=GLRuntimeData::Get()->DiamondInItems(outCome->speedUPItems);
因为代码行:1742GLOutcomeInfo*outCome=GLDataManager::Get()->getOutComeInfoByID(outID);中的函数getOutComeInfoByID&GLOutcomeInfo会返回空指针导致int64diamond=GLRuntimeData::Get()->DiamondInItems(outCome->speedUPItems);发生空指针引起的Crash;
【说明:下面自动给出会returnNULL的函数所在文件路径以及原始代码实现】
上面为采用本发明实施例的算法自动生成的空指针问题定位报告,无需开发人员或测试人员再打开其他工具去查找是否返回值类型为GLOutcomeInfo*的函数getOutComeInfoByID(outID);一定会returnNULL。省去了其他工具需要开发人员或测试人员打开其他工具搜索getOutComeInfoByID(outID)实现的代码文件,并找到返回值类型为GLOutcomeInfo*的函数实现,是否真的会returnNULL的可能。
以赤壁乱舞手游前端代码为例,用CPPcheck告警有200多条需要人工逐条分析定位,但用本发明实施例的算法1分钟内分析直接给出52个100%是空指针崩溃的问题,大大减少了人工逐条分析定位的成本。
以全民农场手游前端代码50万行为例,用CPPcheck告警有1000多条,按一条人工分析定位至少1分钟计算,需要1000分钟。而用本发明实施例的算法在1分钟内分析直接给出32个100%是空指针崩溃的问题,而看本发明算法装置的每个问题无需再进行代码搜索和代码文件跳转操作,目测时间在3~10秒,问题定位时间成本得到上千倍的提升。
采用本发明实施例的算法,相对于只对函数内部Var=NULL实现的Var变量进行判空保护代码的判断,则会遗漏很多函数会返回NULL导致的空指针崩溃的问题。仍然以全民农场手游前端代码50万行为例:用本发明实施例的算法进行代码分析后,额外发现了32个100%是空指针崩溃的问题,而且这32个问题是Coverity的原理没有发现的。
本发明实施例一种空指针崩溃的挖掘装置,如图2所示,包括:
函数获取单元201,用于获取全量代码文件内返回空指针的函数;
变量获取单元202,用于获取待挖掘的代码中使用了上述空指针的变量作为危险变量;
代码搜索单元203,用于使用上述危险变量进行前向搜索;
危险确定单元204,用于若搜索得到使用了上述危险变量的代码行,并且上述代码行未进行判空保护,则确定上述代码行为产生空指针崩溃的代码行。
在本实施例中,全量代码可以就是待挖掘的代码,待挖掘的代码也可以仅是全量代码的一部分代码。全量代码用于确定返回空指针的函数,但是返回空指针的函数并不一定会造成空指针崩溃,因此获取全量代码文件内返回空指针的函数作为空指针崩溃的挖掘前期准备。
在本实施例中,找到危险变量是为了确定使用了空指针的变量,危险变量是可能导致代码出现空指针崩溃的变量,但是并不一定会产生空指针崩溃,因此本发明实施例还需要进一步进行确认。
在本发明实施例中,前向搜索的代码条数可以人为限定,也可以是对危险变量的生命周期所在的代码段进行前向搜索,前向搜索的条数本发明实施例不做唯一性限定。
在本实施例中,首先确定返回空指针的函数,然后通过返回空指针函数被使用的情况确定危险变量,然后通过危险变量定位到产生空指针崩溃的代码行。可以准确找出会导致软件崩溃的空指针。
即使使用了空指针,也并不代表一定会产生空指针崩溃,因此也不能认为是危险变量,因为有可能是并不会被执行的代码,例如:注释型代码。因此为了进一步提高挖掘空指针崩溃的代码的准确性,本实施例可以进一步地如下:上述代码搜索单元203,还用于在使用上述危险变量进行前向搜索之前,确定上述危险变量是否为注释型代码行,若不,则使用上述危险变量进行前向搜索。
本发明实施例还给出了危险函数库模型的创建方案,用来提高查找危险变量的准确性,具体如下:可选地,上述函数获取单元201,用于获取全量代码文件内各函数中返回值类型为空的函数名;将构造空指针的危险函数库模型,上述危险函数库模型的键值为:返回值类型为空的函数名以及返回值类型。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:可选地,上述函数获取单元201,还用于获取上述返回值类型为空的函数名所在代码的文件路径,以及从函数名开始到返回值为空的代码段,并记录到上述危险函数库模型。
基于本发明实施例给出的危险函数库模型,本发明实施例还提供了优选的确定危险变量的实现方案,如下:上述变量获取单元202,用于获取上述待挖掘的代码中符合上述危险函数库模型的键值,并且使用了上述危险函数库模型中的函数赋值的变量,作为危险变量。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:进一步地,如图3所示,上述挖掘装置还包括:
信息获取单元301,用于在确定上述代码行为产生空指针崩溃的代码行之后,获取上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
在确定了会产生空指针崩溃的代码行以后,还可以进行告警,告警的方式可以是现实空指针崩溃提示,提示的信息可以有多种形式,本发明实施例给出了优选的实现方式,如下:如图4所示,上述挖掘装置还包括:
告警输出单元401,用于输出告警信息,并输出上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
本发明实施例还提供了另一种空指针崩溃的挖掘装置,如图5所示,包括:接收器501、发射器502、处理器503,以及存储器504;
其中,处理器503,用于获取全量代码文件内返回空指针的函数;获取待挖掘的代码中使用了上述空指针的变量作为危险变量;使用上述危险变量进行前向搜索,若搜索得到使用了上述危险变量的代码行,并且上述代码行未进行判空保护,则确定上述代码行为产生空指针崩溃的代码行。
在本实施例中,全量代码可以就是待挖掘的代码,待挖掘的代码也可以仅是全量代码的一部分代码。全量代码用于确定返回空指针的函数,但是返回空指针的函数并不一定会造成空指针崩溃,因此获取全量代码文件内返回空指针的函数作为空指针崩溃的挖掘前期准备。
在本实施例中,找到危险变量是为了确定使用了空指针的变量,危险变量是可能导致代码出现空指针崩溃的变量,但是并不一定会产生空指针崩溃,因此本发明实施例还需要进一步进行确认。
在本发明实施例中,前向搜索的代码条数可以人为限定,也可以是对危险变量的生命周期所在的代码段进行前向搜索,前向搜索的条数本发明实施例不做唯一性限定。
在本实施例中,首先确定返回空指针的函数,然后通过返回空指针函数被使用的情况确定危险变量,然后通过危险变量定位到产生空指针崩溃的代码行。可以准确找出会导致软件崩溃的空指针。
即使使用了空指针,也并不代表一定会产生空指针崩溃,因此也不能认为是危险变量,因为有可能是并不会被执行的代码,例如:注释型代码。因此为了进一步提高挖掘空指针崩溃的代码的准确性,本实施例可以进一步地如下:上述处理器503,还用于在使用上述危险变量进行前向搜索之前,确定上述危险变量是否为注释型代码行,若不是,则使用上述危险变量进行前向搜索。
本发明实施例还给出了危险函数库模型的创建方案,用来提高查找危险变量的准确性,具体如下:上述处理器503,用于获取全量代码文件内返回空指针的函数,包括:
用于获取全量代码文件内各函数中返回值类型为空的函数名;
将构造空指针的危险函数库模型,上述危险函数库模型的键值为:返回值类型为空的函数名以及返回值类型。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:上述处理器503,还用于获取上述返回值类型为空的函数名所在代码的文件路径,以及从函数名开始到返回值为空的代码段,并记录到上述危险函数库模型。
基于本发明实施例给出的危险函数库模型,本发明实施例还提供了优选的确定危险变量的实现方案,如下:上述处理器503,用于获取待挖掘的代码中使用了上述空指针的变量作为危险变量,包括:
用于获取上述待挖掘的代码中符合上述危险函数库模型的键值,并且使用了上述危险函数库模型中的函数赋值的变量,作为危险变量。
进一步地,对于危险函数库模型而言,除了以上键值以外还可以包含一些后续用于告警的信息,以及其他用途的信息,具体如下:上述处理器503,还用于在确定上述代码行为产生空指针崩溃的代码行之后,获取上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
在确定了会产生空指针崩溃的代码行以后,还可以进行告警,告警的方式可以是现实空指针崩溃提示,提示的信息可以有多种形式,本发明实施例给出了优选的实现方式,如下:上述处理器503,还用于在获取上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径之后,输出告警信息,并输出上述危险变量到上述危险代码行之间的代码,以及,上述返回值类型为空的函数名所在代码的文件路径。
图6是本发明实施例提供的一种空指针崩溃的挖掘设备,该设备的功能由服务器实现,该服务器600可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(centralprocessingunits,CPU)622(例如,一个或一个以上处理器)和存储器632,一个或一个以上存储应用程序642或数据644的存储介质630(例如一个或一个以上海量存储设备)。其中,存储器632和存储介质630可以是短暂存储或持久存储。存储在存储介质630的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器622可以设置为与存储介质630通信,在服务器600上执行存储介质630中的一系列指令操作。
服务器600还可以包括一个或一个以上电源626,一个或一个以上有线或无线网络接口650,一个或一个以上输入输出接口658,和/或,一个或一个以上操作系统641,例如WindowsServerTM,MacOSXTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由入空指针崩溃的挖掘装置所执行的步骤可以基于该图6所示的服务器结构。
值得注意的是,上述装置只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
另外,本领域普通技术人员可以理解实现上述各方法实施例中的全部或部分步骤是可以通过程序来指令相关的硬件完成,相应的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明实施例揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (14)

1.一种空指针崩溃的挖掘方法,其特征在于,包括:
获取全量代码文件内返回空指针的函数;
获取待挖掘的代码中使用了所述空指针的变量作为危险变量;
使用所述危险变量进行前向搜索,若搜索得到使用了所述危险变量的代码行,并且所述代码行未进行判空保护,则确定所述代码行为产生空指针崩溃的代码行。
2.根据权利要求1所述方法,其特征在于,在使用所述危险变量进行前向搜索之前还包括:
确定所述危险变量是否为注释型代码行,若不是,则使用所述危险变量进行前向搜索。
3.根据权利要求1所述方法,其特征在于,所述获取全量代码文件内返回空指针的函数;包括:
获取全量代码文件内各函数中返回值类型为空的函数名;
将构造空指针的危险函数库模型,所述危险函数库模型的键值为:返回值类型为空的函数名以及返回值类型。
4.根据权利要求3所述方法,其特征在于,所述方法还包括:
获取所述返回值类型为空的函数名所在代码的文件路径,以及从函数名开始到返回值为空的代码段,并记录到所述危险函数库模型。
5.根据权利要求1至4任意一项所述方法,其特征在于,所述获取待挖掘的代码中使用了所述空指针的变量作为危险变量;包括:
获取所述待挖掘的代码中符合所述危险函数库模型的键值,并且使用了所述危险函数库模型中的函数赋值的变量,作为危险变量。
6.根据权利要求5所述方法,其特征在于,在确定所述代码行为产生空指针崩溃的代码行之后,所述方法还包括:
获取所述危险变量到所述危险代码行之间的代码,以及,所述返回值类型为空的函数名所在代码的文件路径。
7.根据权利要求6所述方法,其特征在于,在获取所述危险变量到所述危险代码行之间的代码,以及,所述返回值类型为空的函数名所在代码的文件路径之后,所述方法还包括:
输出告警信息,并输出所述危险变量到所述危险代码行之间的代码,以及,所述返回值类型为空的函数名所在代码的文件路径。
8.一种空指针崩溃的挖掘装置,其特征在于,包括:
函数获取单元,用于获取全量代码文件内返回空指针的函数;
变量获取单元,用于获取待挖掘的代码中使用了所述空指针的变量作为危险变量;
代码搜索单元,用于使用所述危险变量进行前向搜索;
危险确定单元,用于若搜索得到使用了所述危险变量的代码行,并且所述代码行未进行判空保护,则确定所述代码行为产生空指针崩溃的代码行。
9.根据权利要求8所述挖掘装置,其特征在于,
所述代码搜索单元,还用于在使用所述危险变量进行前向搜索之前,确定所述危险变量是否为注释型代码行,若不是,则使用所述危险变量进行前向搜索。
10.根据权利要求8所述挖掘装置,其特征在于,
所述函数获取单元,用于获取全量代码文件内各函数中返回值类型为空的函数名;将构造空指针的危险函数库模型,所述危险函数库模型的键值为:返回值类型为空的函数名以及返回值类型。
11.根据权利要求10所述挖掘装置,其特征在于,
所述函数获取单元,还用于获取所述返回值类型为空的函数名所在代码的文件路径,以及从函数名开始到返回值为空的代码段,并记录到所述危险函数库模型。
12.根据权利要求8至11任意一项所述挖掘装置,其特征在于,
所述变量获取单元,用于获取所述待挖掘的代码中符合所述危险函数库模型的键值,并且使用了所述危险函数库模型中的函数赋值的变量,作为危险变量。
13.根据权利要求12所述挖掘装置,其特征在于,所述挖掘装置还包括:
信息获取单元,用于在确定所述代码行为产生空指针崩溃的代码行之后,获取所述危险变量到所述危险代码行之间的代码,以及,所述返回值类型为空的函数名所在代码的文件路径。
14.根据权利要求13所述挖掘装置,其特征在于,所述挖掘装置还包括:
告警输出单元,用于输出告警信息,并输出所述危险变量到所述危险代码行之间的代码,以及,所述返回值类型为空的函数名所在代码的文件路径。
CN201410664753.2A 2014-11-19 2014-11-19 一种空指针崩溃的挖掘方法及装置 Active CN105607990B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410664753.2A CN105607990B (zh) 2014-11-19 2014-11-19 一种空指针崩溃的挖掘方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410664753.2A CN105607990B (zh) 2014-11-19 2014-11-19 一种空指针崩溃的挖掘方法及装置

Publications (2)

Publication Number Publication Date
CN105607990A true CN105607990A (zh) 2016-05-25
CN105607990B CN105607990B (zh) 2019-07-05

Family

ID=55987942

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410664753.2A Active CN105607990B (zh) 2014-11-19 2014-11-19 一种空指针崩溃的挖掘方法及装置

Country Status (1)

Country Link
CN (1) CN105607990B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置
CN108062273A (zh) * 2016-11-08 2018-05-22 阿里巴巴集团控股有限公司 一种程序的优化方法及装置
CN109426615A (zh) * 2017-09-01 2019-03-05 深圳市源伞新科技有限公司 过程间的空指针解引用检测方法、系统、设备以及介质
CN111026631A (zh) * 2018-10-09 2020-04-17 顺丰科技有限公司 接口自动化检测方法、装置和服务器

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7051238B2 (en) * 2002-07-30 2006-05-23 Hewlett-Packard Development Company, L.P. Method and system for using machine-architecture support to distinguish function and routine return values
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103914382A (zh) * 2014-03-25 2014-07-09 北京邮电大学 一种充分识别指针引用检测对象的方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7051238B2 (en) * 2002-07-30 2006-05-23 Hewlett-Packard Development Company, L.P. Method and system for using machine-architecture support to distinguish function and routine return values
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103914382A (zh) * 2014-03-25 2014-07-09 北京邮电大学 一种充分识别指针引用检测对象的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
杨睿 等: "Java中空指针引用故障的静态检测方法", 《清华大学学报(自然科学版)》 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108062273A (zh) * 2016-11-08 2018-05-22 阿里巴巴集团控股有限公司 一种程序的优化方法及装置
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置
CN109426615A (zh) * 2017-09-01 2019-03-05 深圳市源伞新科技有限公司 过程间的空指针解引用检测方法、系统、设备以及介质
CN111026631A (zh) * 2018-10-09 2020-04-17 顺丰科技有限公司 接口自动化检测方法、装置和服务器
CN111026631B (zh) * 2018-10-09 2024-03-26 顺丰科技有限公司 接口自动化检测方法、装置和服务器

Also Published As

Publication number Publication date
CN105607990B (zh) 2019-07-05

Similar Documents

Publication Publication Date Title
CN108664374B (zh) 故障告警模型创建方法、装置、故障告警方法及装置
CN102339252B (zh) 基于xml中间模型以及缺陷模式匹配的静态检测系统
CN104899147B (zh) 一种面向安全检查的代码静态分析方法
CN109426723A (zh) 使用释放后内存的检测方法、系统、设备及存储介质
US10761963B2 (en) Object monitoring in code debugging
CN105787367B (zh) 一种软件更新的补丁安全性检测方法及系统
CN107066246B (zh) 一种软件开发方法及装置
Phan et al. Statistical learning of api fully qualified names in code snippets of online forums
Buinevich et al. The life cycle of vulnerabilities in the representations of software for telecommunication devices
CN105607990A (zh) 一种空指针崩溃的挖掘方法及装置
CN109783356A (zh) 一种自动化测试方法及终端
CN108399124A (zh) 应用测试方法、装置、计算机设备和存储介质
CN105468517B (zh) 一种基于黑盒测试用例约简的统计错误定位方法
CN103294596A (zh) 一种基于程序不变量的合约式软件故障预警方法
CN104715190B (zh) 一种基于深度学习的程序执行路径的监控方法及系统
CN110059006A (zh) 代码审计方法及装置
KR101696694B1 (ko) 역추적을 이용한 소스 코드 취약점 분석 방법 및 장치
CN111753302A (zh) 检测代码漏洞的方法、装置、计算机可读介质及电子设备
CN106815215A (zh) 生成标注库的方法和装置
CN107239387A (zh) 一种数据异常检测方法及终端
CN113886832A (zh) 智能合约漏洞检测方法、系统、计算机设备和存储介质
CN104603791A (zh) 签名验证装置及签名验证方法和程序
CN112149828A (zh) 基于深度学习框架的算子精度检测方法和装置
CN104104659A (zh) 一种通信指纹的提取方法以及装置
CN113805861B (zh) 基于机器学习的代码生成方法、代码编辑系统及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant