CN112069052A - 一种异常对象检测方法、装置、设备及存储介质 - Google Patents

一种异常对象检测方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN112069052A
CN112069052A CN201910503271.1A CN201910503271A CN112069052A CN 112069052 A CN112069052 A CN 112069052A CN 201910503271 A CN201910503271 A CN 201910503271A CN 112069052 A CN112069052 A CN 112069052A
Authority
CN
China
Prior art keywords
target object
member variable
judgment
calling
object set
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
CN201910503271.1A
Other languages
English (en)
Other versions
CN112069052B (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 Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910503271.1A priority Critical patent/CN112069052B/zh
Publication of CN112069052A publication Critical patent/CN112069052A/zh
Application granted granted Critical
Publication of CN112069052B publication Critical patent/CN112069052B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提供一种异常对象检测方法、装置、设备及存储介质,所述方法包括:获取目标对象集,所述目标对象集中包括至少一个成员变量;对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据;遍历所述语法树结构数据,得到每个成员变量的属性信息;基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数;基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。本申请能够根据成员变量的使用情况有效识别出哪些成员变量在使用前有必要进行空指针判定操作,防止由于成员变量使用不当导致的空指针问题。

Description

一种异常对象检测方法、装置、设备及存储介质
技术领域
本申请属于计算机技术领域,具体涉及一种异常对象检测方法、装置、设备及存储介质。
背景技术
目前较为流行的软件开发方式为面向对象程序设计,而在编写代码文件过程中往往由于成员变量使用前忘记进行空指针判定操作,从而导致程序运行中出现由于空指针异常的崩溃。在空指针异常的崩溃过程中,使用空指针变量的代码行,被称为空指针崩溃代码。由于空指针崩溃代码存在引起程序崩溃的风险,为了避免这种风险,通常需要进行判空保护,判空保护的过程一般是:判断指针变量的值是否等空,如果指针变量值等于空时,就不使用该指针变量,如果不等于空则可以使用该指针变量。
现有技术中通常通过获取项目代码文件中的所有定义的函数,遍历函数内容是否有返回空值的代码,从而实现对空指针的检测,然而现有技术的应用范围仅为函数返回空值导致的空指针,并不能够避免由于成员变量使用不当导致的空指针问题。
发明内容
为了有效识别出哪些成员变量在使用前有必要进行空指针判定操作,防止由于成员变量使用不当导致的空指针问题,本申请提出一种异常对象检测方法、装置、设备及存储介质。
一方面,本申请提出了一种异常对象检测方法,所述方法包括:
获取目标对象集,所述目标对象集中包括至少一个成员变量;
对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据;
遍历所述语法树结构数据,得到每个成员变量的属性信息;
基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数;
基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
另一方面,本申请提出了一种异常对象检测装置,所述装置包括:
第一获取模块,用于获取目标对象集,所述目标对象集中包括至少一个成员变量;
分析模块,用于对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据;
第二获取模块,用于遍历所述语法树结构数据,得到每个成员变量的属性信息;
第三获取模块,用于基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数;
确定模块,用于基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
另一方面,本申请提出了一种设备,所述设备包括:处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上述所述的异常对象检测方法。
另一方面,本申请提出了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如上述所述的异常对象检测方法。
本申请提出的一种异常对象检测方法、装置、设备及存储介质,通过词法分析和语法分析将目标对象集解析成语法树结构数据,遍历该语法树结构数据得到每个成员变量的属性信息,基于每个成员变量的属性信息,统计得到该成员变量的调用次数以及调用前的判空次数,最后根据调用次数以及判空次数,确定目对象集中的异常对象检测结果,实现了根据成员变量的使用情况判定哪些成员变量在使用前是否有必要进行空指针判定操作,能够有效避免由于成员变量使用不当导致的空指针问题,防止由于程序员疏忽导致空指针问题在程序中出现。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案和优点,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1是本申请实施例提供的一种异常对象检测方法的流程示意图。
图2是本申请实施例提供的对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据的一种流程示意图。
图3是本申请实施例提供的遍历所述语法树结构数据,得到每个成员变量的属性信息的一种流程示意图。
图4是本申请实施例提供的基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果的一种流程示意图。
图5是本申请实施例提供的异常对象检测方法的一种应用场景图。
图6是本申请实施例提供的一种异常对象检测装置的结构示意图。
图7是本申请实施例提供的一种服务器的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了更清楚的说明本申请,下面先介绍一下本申请中需要使用到的基本概念。
面向对象程序设计(Object-oriented programming,OOP):指的是一种程序设计模型,同时也是一种程序开发的方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。OOP中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。
类(class):指的是OOP中实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。
变量:指的是在程序的运行过程中随时可以发生变化的量,变量是程序中数据的临时存放场所,程序退出后,变量存储的内容不再存在。简而言之,变量是用于跟踪几乎所有类型信息的简单工具。
成员变量:在类中声明的变量称为成员变量,成员变量又可以进一步包括实例变量和类变量。类变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同,而实例变量则从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。成员变量无需显示初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。
空指针:是指针的一种,指针指的是值为内存地址的一种变量,空指针则指的是内存地址为空的指针变量。
空指针判定操作:指的是判定内存地址是否为空的一种操作,简称判空操作。
空指针异常崩溃或空指针错误(NullPointer Exception):是指声明了一个对象,但没有对该对象正确初始化也没有进行错误判断而造成的程序崩溃。
本申请实施例中的异常对象检测方法可以在终端中进行,该终端可以包括智能手机、台式电脑、平板电脑、笔记本电脑、数字助理、智能可穿戴设备、车载、音箱、电视、机器人等类型的实体设备,也可以包括运行于实体设备中的软体,例如虚拟机等。该异常对象检测方法还可以在服务器中进行,该服务器可以包括一个独立运行的服务器,或者分布式服务器,或者由多个服务器组成的服务器集群。
以下介绍本申请中的一种异常对象检测方法,图1是本申请实施例提供的一种异常对象检测方法的流程示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或服务器产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。具体的如图1所示,所述方法可以包括以下步骤:
S101.获取目标对象集,所述目标对象集中包括至少一个成员变量。
本说明书实施例中,该异常对象检测方法可以用于检测OOP中类的成员变量的使用导致的空指针,在该应用场景下,所述目标对象集可以为OOP中的项目代码文件,该项目代码文件集可以包括多个不同的代码,每个代码中可以至少包括一个成员变量。相应地,步骤S101可以进一步包括以下步骤:
获取项目代码文件,所述项目代码文件中包括至少一个成员变量。
在一个可行的实施例中,在得到OOP中的项目代码文件之后,可以通过静态分析技术,解析该面向对象开发的项目代码文件,从而获取项目代码文件中所有软件开发实现的类型代码中各个成员变量的定义信息、被调用的信息和被调用前是否进行空指针判定操作的判空的信息。其中,静态分析指的是在不执行程序的情况下对程序行为进行分析的理论、技术。因静态分析技术具有直接分析程序源代码,不需要执行程序的特点,因此采用静态分析技术可以全面分析程序,避开由于测试数据不完善导致的遗漏。该静态分析的具体过程可以如下述S103-S105所示。
S103.对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据。
在本说明书实施例中,可以对得到的目标对象集,即对项目代码文件进行抽象语法树(Abstract Syntax Tree,AST)解析,从而得到与该项目代码文件对应的语法树结构数据,其中,抽象语法树是源代码语法结构的一种抽象表示,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
在一个可行的实施例中,如图2所示,AST解析包括词法分析和语法分析两大部分,则所述对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据,可以包括以下步骤:
S201.对所述目标对象集中的字符进行词法分析,得到与所述目标对象集对应的词法单词序列。
在一个可行的实施例中,词法分析是将纯文本的项目代码文件,采用开源的词法分析工具,从左至右逐个字符地对项目代码文件中的代码进行扫描,产生一个个的词法标记(token),比如关键字、数字、运算符、标识符等token,从而把作为字符串的目标代码文件改造成为词法单词序列。词法分析程序在每次读入一个字符时,就根据状态转换图跳转到相应的状态,如果跳转到一个“终结状态”,就说明当前已经解析到一个有效的词法记号token,程序会给出这个记号,重置到初始状态并继续读入下一个字符,重复循环直至读到代码末尾。
在一个可行的实施例中,为了保证词法分析结果的准确性,在进行词法分析之前,可以对项目代码文件中的代码执行消除歧义的操作,比如,可以预先确定代码中可能存在的拼接引号,如果某行代码不存在前置引号,则可以直接进行词法分析,如果某行代码存在前置引号,则需要在该代码前补充一个单引号才能进行正确的词法分析,否则会将位于该拼接引号处的字符直接识别为纯粹的单词。对项目代码文件进行消除歧义操作能够有效提高词法分析结果的准确性。
S203.对所述词法单词序列进行语法分析,得到与所述目标对象集对应的多条语句。
在一个可行的实施例中,在词法分析的基础上,可以采用开源的语法分析工具,对词法单词序列进行语法分析,得到符合语法规则(上下无法文法)语句,该符合语法规则的语句包括但不限于表达式、函数、对象、声名、赋值、循环、条件分支等语句。
S205.基于得到的所述多条语句,构建与所述目标对象集对应的语法树结构数据。
本说明书实施例中,在得到表达式、函数、对象、声名、赋值、循环、条件分支等语句之后,可以根据得到的语句组成与项目代码文件对应的语法树结构数据。
在一个可行的实施例中,S203-S205可以通过开源工具JavaCC(Java CompilerCompiler)、antlr(another tool for language recognition)、ASTparser(AST语法树解析器)来实现。还可以使用eclipse开源框架JDT(Java Development Tools)编写的解析工具来实现。其中,JavaCC是一个能生成语法和词法分析器的生成程序,JavaCC可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹配该语法的Java程序,Java是一种面向对象编程语言。antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。Eclipse是一个开放源代码的、基于Java的可扩展开发平台,就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。JDT是Eclipse平台的全功能的Java集成开发环境插件。
S105.遍历所述语法树结构数据,得到每个成员变量的属性信息。
在一个可行的实施例中,所述语法树结构数据包括至少一个不同类型的节点,每个节点可以被设置为支持一个统一的访问者模式接口,如图3所示,所述遍历所述语法树结构数据,得到每个成员变量的属性信息,可以包括以下步骤:
S301.通过所述访问者模式编写变量提取公式。
S303.通过所述变量提取公式,遍历访问所述语法树结构数据中的每个节点。
S305.基于遍历结果,得到每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息。
本说明书实施例中,访问者模式表示一种作用于某对象结构中的各元素的操作。访问者模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。访问者模式需要在被访问的类中增加一个对外提供接待访问者的对外接口,因此,可以将语法树结构数据中的每个节点均设置为支持一个统一的访问者模式接口,通过该访问者模式接口可以实现对语法树结构数据通过访问者模式进行进一步的不同形式的加工、遍历访问和输出。
在一个可行的实施例中,通过访问者模式编写变量提取公式,比如编写类与函数、成员变量等访问者类等,通过该遍历提取公式遍历访问语法树结构数据中的每个节点,因为每个节点的类型可能不一样,那么变量提取公式可以根据不同节点的类型来设置,即每个节点可以对应不同的变量提取公式。
在一个可行的实施例中,因为语法树结构数据中的每个节点均对应项目代码文件中的一种语法结构,因此,通过访问者模式,可以从语法树结构数据中的节点中可以获取每个成员变量的属性信息,该属性信息可以包括每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息。
在实际应用中,成员变量的定义信息包括但不限于成员变量的名称、所处的位置以及类型等信息。
在实际应用中,因为成员变量不仅可以被其所位于的代码调用(即内部私有调用),还可以被项目代码文件中的其他外部代码调用(即外部公有调用),所以通过遍历语法树结构数据可以获得每个成员变量被所述目标代码文件中的多个代码分别调用的调用信息,比如某一成员变量A位于代码1中,其分别被代码1、代码2、代码3、代码4和代码5这5个代码调用,则该成员变量A的调用信息可以包括:成员变量A被代码1调用的调用信息、被代码2调用的调用信息、被代码3调用的调用信息、被代码4调用的调用信息以及被代码5调用的调用信息。
在实际应用中,每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息,可以为每个成员变量被项目代码文件中的多个代码分别调用前是否进行空指针判定操作的判空信息,比如,比如某一成员变量A位于代码1中,其分别被代码1、代码2、代码3、代码4和代码5这5个代码调用,则该成员变量A的判空信息可以包括:成员变量A被代码1调用前是否进行指针判定操作、成员变量A被代码2调用前是否进行指针判定操作、成员变量A被代码3调用前是否进行指针判定操作、成员变量A被代码4调用前是否进行指针判定操作以及成员变量A被代码5调用前是否进行指针判定操作
本说明书实施例中,成员变量的调用信息以及判空信息可以认为是成员变量的使用情况,由于成员变量的使用情况能够准确反映空指针问题,通过获取成员变量的使用情况进行概率统计,从而判定哪些成员变量使用前是否有必要进行判空操作,不仅操作简单,而且能够有效提高检测结果的准确性。且由于语法树结构数据的特殊性,采用访问者模式编写代码或函数来提取成员变量的属性信息,能够在不改变各元素类的前提下,即不污染目标代码文件中代码的前提下,方便、高效且准确地提取出成员变量的定义信息、调用信息以及判空信息,从而进一步提高异常对象检测,即空指针异常检测的准确性。
S107.基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数。
本说明书实施例中,在得到每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息之后,可以基于每个成员变量的定义信息、调用信息以及判空信息,统计所述成员变量被所述目标对象集中的对象调用的调用总次数以及调用前进行空指针判定操作的判空总次数。
比如,某一成员变量A位于代码1中,其分别被代码1、代码2、代码3、代码4和代码5这5个代码调用,则根据该成员变量A的定义信息、该成员变量A被上述5个代码调用的调用信息以及成员变量A被上述5个代码分别调用之前是否进行空指针判定操作的判空信息,统计该成员变量被项目文件中的代码调用的调用总次数以及判空总次数,比如,如果代码1和代码2在调用成员变量A之前进行判空操作,代码3、代码4和代码5在调用成员变量A之前未进行判空操作,则该成员变量A的调用总次数为5次,判空总次数为2次。
S109.基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
本说明书实施例中,如图4所示,在得到每个成员变量的调用总次数以及判空总次数之后,所述基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果,可以包括以下步骤:
S401.基于每个成员变量的判空总次数与第一阈值的和,得到与所述成员变量对应的第一判断值。
S403.基于每个成员变量的调用总次数与第一阈值的和,得到与所述成员变量对应的第二判断值。
S405.当所述第一判断值与所述第二判断值的商大于第二阈值,则获取调用所述成员变量但调用前未进行空指针判定操作的对象。
S407.将所述调用所述成员变量但调用前未进行空指针判定操作的对象,确定为需要进行空指针判定操作的目标对象。
在一个可行的实施例中,如果(判空总次数+第一阈值)/(调用总次数+第二阈值)的值大于第二阈值,则说明该成员变量存在空指针隐患,因此,需要根据成员变量的调用信息获取所有调用该成员变量但调用前未进行空指针判定操作的代码,并将该调用该成员变量但调用前未进行空指针判定操作的代码确定为目标对象。比如,某一成员变量A被代码1、代码2、代码3、代码4、和代码5调用,调用前判空次数为4次(代码1、代码2、代码3、代码5在调用成员变量A之前均判空,代码4在调用之前未判空),第二阈值为80%,第一阈值为1,则第一判断值为(4+1)=5,第二判断值为(5+1)=6,第一判断值与第二判断值的商为83.3%,即第一判断值与第二判断值的商大于第二阈值,则获取调用成员变量A但在调用前未进行空指针判定操作的代码4,该代码4即为目标对象。
在一个可行的实施例中,在得到需要进行空指针判定操作的目标对象之后,所述方法还可以包括:
对所述目标对象进行警告,比如,可以根据成员变量A的定义信息,查找该成员变量的变量名,该变量名所在的代码的行号,根据代码的行号以及该代码所处的源代码,在项目源管理系统的日志中查找该空指针的提交人信息,根据该提交人信息中的联系信息通知还提交人存在空指针隐患,在提交人得知该目标对象存在空指针异常隐患时,对所述目标对象进行空指针判定操作。
本说明书实施例中,在得到需要进行空指针判定操作的目标对象之后,能够立刻通知、提醒提交人,以利于在第一时间修改由于空指针异常所造成的程序缺陷,有效降低程序崩溃风险。
在一个可行的实施例中,第一阈值相当于是基数值,基数值是为了解决当一个成员变量调用总次数较低时,其最终计算结果二极化的问题。使用基数值后,最终结果较为稳定,防止由于结果二极化造成的误报和漏报。第二阈值相当于是边界值,边界值可以是一个大于等于0,小于1的概率值。边界值用于判断一个成员变量是否会有空指针问题。如设置边界值为80%,则一个成员变量计算结果大于80%则表示有空指针隐患。所述基数值和所述边界值均可以预先设置好,用户可以根据实际情况自主调整基数值和边界值。
在一个可行的实施例中,由于基数值和该边界值可以由用户自主调整,那么在得到异常对象检测结果之后,可以根据异常对象检测结果,调整基数值和边界值,从而使目标代码文件中尽可能多的成员变量以及引用该成员变量的代码参与到异常检测过程中,以提高异常对象的检测范围,使异常对象的检测效果,即空指针的检测效果达到最佳。下面,举例说明如何根据异常对象检测结果,自主调整基数值或边界值:
一、不需要调整基数值和边界值的情况
(1)预先设置基数值为1,边界值为80%。
(2)如果根据每个成员变量的调用信息和判空信息,确定某一成员变量A分别被代码1、代码2、代码3、代码4、和代码5调用,且代码1、代码2、代码3、代码5在调用成员变量A之前均进行空指针判定操作,代码4在调用成员变量A之前未进行空指针判定操作,则成员变量A的调用次数是5次,判空次数是4次,则根据S401-S407,计算得到第一判断值与第二判断值的商为83.3%,可见,第一判断值与第二判断值的商大于边界值80%,则获取调用成员变量A但在调用前未进行空指针判定操作的代码4,并将该代码4确定为需要进行空指针判定操作的目标对象。由于第一判定值与第二判定值的商大于边界值,这样就可以将所有其他调用成员变量A但在调用前未进行空指针判定操作的代码提取出,并对所有其他调用成员变量A但在调用前未进行空指针判定操作的代码进行判空操作,由此就可以使调用成员变量A的代码均参与到异常检测中来,防止漏报或误报。可见,在第一判定值与第二判定值的商大于边界值的时候,所有成员变量及调用该成员变量的代码均能够参与到异常对象检测过程中来,因此,该情况下是基数值和边界值可以不用调整。
二、需要调整基数值的情况
(1)预先设置基数值为1,边界值为75%。
(2)如果根据每个成员变量的调用信息和判空信息,确定某一成员变量A分别被代码1、代码2、代码3、代码4、和代码5调用,且代码1、代码2、代码3在调用成员变量A之前均进行空指针判定操作,代码4、代码5在调用成员变量A之前均未进行空指针判定操作,则成员变量A的调用次数是5次,判空次数是3次,则根据S401-S407,计算得到第一判断值与第二判断值的商为66.7%,该第一判断值与第二判断值的商明显小于边界值75%,可见,在该情况下,代码4、代码5调用成员变量A的过程无法参与到异常检测过程中来,如果代码4、代码5在调用成员变量A的时候存在空指针隐患,但其又无法参与到异常对象检测过程中来,即出现了空指针异常的漏报和误报,那么程序运行过程中会出现空指针异常的崩溃。为了解决上述问题,在实际应用中,在第一判断值与第二判断值的商明显小于边界值的情况下,可以适当提高基数值,比如将预先设置的基数值1调整到4,那么根据S401-S407,重新计算得到第一判断值与第二判断值的商为77.8%,该重新调整后的商值大于边界值75%,这样就可以使得代码4、代码5调用成员变量A的过程均参与到空指针异常检测过程中来,避免由于计算结果二极化导致的空指针异常的漏报和误报,提高空指针异常检测结果的准确性,使空指针检测结果达到最佳。
图5所示为本申请实施例提供的异常对象检测方法的应用场景图,该应用场景检测OOP中类的成员变量的使用导致的空指针问题,该目标对象集为OOP中的项目代码文件。如图5所示,当需要对异常空指针进行检查时,通过词法分析和语法分析,将项目代码文件解析成语法树结构数据,通过访问者模式编写代码或函数,遍历访问该语法树结构数据中的每个节点得到每个成员变量的定义信息、调用信息和判空信息,基于该定义信息、调用信息和判空信息,统计得到每个成员变量的调用次数以及判空次数,最后计算调用次数与基数值的和以及调用次数与基数值的和的商是否大于边界值,如果是,则获取所有调用每个成员变量但调用前未进行空指针判定操作的代码,并将其作为需要进行判空操作的目标对象。本申请实施例通过静态分析技术,能够有效分析出在面向对象程序设计的代码中,对于成员变量使用不当导致的空指针问题,且一方面,由于成员变量的使用情况能够准确反映空指针问题,通过获取成员变量的使用情况进行概率统计,从而判定哪些成员变量使用前是否有必要进行判空操作,不仅操作简单,而且能够有效提高检测结果的准确性,另一方面,由于使用了访问者模式,能够在不污染目标代码文件中代码的前提下,方便、高效且准确地提取出成员变量的属性信息,为检测结果的准确性打下基础,另一方面,为了解决计算结果二极化的问题,使用基数值来参与最终的结果计算,确保计算结果稳定性,防止由于结果二极化造成的误报和漏报,另一方面,还可以根据异常检测结果自主调整基数值,从而使目标代码文件中尽可能多的成员变量以及引用该成员变量的代码参与到异常检测过程中,以提高异常对象的检测范围,使空指针的异常检测效果达到最佳。
如图6所示,本申请实施例还提供了一种异常对象检测装置,所述装置可以包括:
第一获取模块601,用于获取目标对象集,所述目标对象集中包括至少一个成员变量。
分析模块603,用于对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据。
第二获取模块605,用于遍历所述语法树结构数据,得到每个成员变量的属性信息。
第三获取模块607,用于基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数。
确定模块609,用于基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
在一个可行的实施例中,所述分析模块603可以进一步包括:
词法单词序列获取单元,用于对所述目标对象集中的字符进行词法分析,得到与所述目标对象集对应的词法单词序列。
语句生成单元,用于对所述词法单词序列进行语法分析,得到与所述目标对象集对应的多条语句。
构建单元,用于基于得到的所述多条语句,构建与所述目标对象集对应的语法树结构数据。
在一个可行的实施例中,所述语法树结构数据包括至少一个节点,每个节点均被设置为支持一个统一的访问者模式接口,则第二获取模块605可以进一步包括:
编写单元,用于通过所述访问者模式编写变量提取公式。
遍历单元,用于通过所述变量提取公式,遍历访问所述语法树结构数据中的每个节点。
信息获取单元,用于基于遍历结果,得到每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息。
在一个可行的实施例中,第三获取模块607进一步可以用于:
基于每个成员变量的定义信息、调用信息以及判空信息,统计所述成员变量被所述目标对象集中的对象调用的调用总次数以及调用前进行空指针判定操作的判空总次数。
在一个可行的实施例中,确定模块609进一步可以包括:
第一判断值确定单元,用于基于每个成员变量的判空总次数与第一阈值的和,得到与所述成员变量对应的第一判断值。
第二判断值确定单元,用于基于每个成员变量的调用总次数与第一阈值的和,得到与所述成员变量对应的第二判断值。
对象获取单元,用于当所述第一判断值与所述第二判断值的商大于第二阈值,则获取调用所述成员变量但调用前未进行空指针判定操作的对象。
目标对象确定单元,用于将所述调用所述成员变量但调用前未进行空指针判定操作的对象,确定为需要进行空指针判定操作的目标对象。
在一个可行的实施例中,所述装置还可以包括:
空指针判定模块,用于对所述目标对象进行空指针判定操作。
本申请实施例还提供了一种异常对象检测设备,该设备包括处理器和存储器,该存储器中存储有至少一条指令、至少一段程序、代码集或指令集,该至少一条指令、该至少一段程序、该代码集或指令集由该处理器加载并执行以实现如上述方法实施例所提供的异常对象检测方法。
本申请的实施例还提供了一种存储介质,所述存储介质可设置于终端之中以保存用于实现方法实施例中一种异常对象检测方法相关的至少一条指令、至少一段程序、代码集或指令集,该至少一条指令、该至少一段程序、该代码集或指令集由该处理器加载并执行以实现上述方法实施例提供的异常对象检测方法。
可选地,在本说明书实施例中,存储介质可以位于计算机网络的多个网络服务器中的至少一个网络服务器。可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
本说明书实施例所述存储器可用于存储软件程序以及模块,处理器通过运行存储在存储器的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、功能所需的应用程序等;存储数据区可存储根据所述设备的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器还可以包括存储器控制器,以提供处理器对存储器的访问。
本申请实施例所提供的异常对象检测方法实施例可以在移动终端、计算机终端、服务器或者类似的运算装置中执行。以运行在服务器上为例,图7是本申请实施例提供的一种异常对象检测方法的服务器的硬件结构框图。如图7所示,该服务器700可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(Central ProcessingUnits,CPU)710(处理器1210可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器730,一个或一个以上存储应用程序723或数据722的存储介质720(例如一个或一个以上海量存储设备)。其中,存储器730和存储介质720可以是短暂存储或持久存储。存储在存储介质720的程序可以包括一个或一个以上模块,每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器710可以设置为与存储介质720通信,在服务器700上执行存储介质720中的一系列指令操作。服务器700还可以包括一个或一个以上电源760,一个或一个以上有线或无线网络接口750,一个或一个以上输入输出接口740,和/或,一个或一个以上操作系统721,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
输入输出接口740可以用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务器700的通信供应商提供的无线网络。在一个实例中,输入输出接口740包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,输入输出接口740可以为射频(RadioFrequency,RF)模块,其用于通过无线方式与互联网进行通讯。
本领域普通技术人员可以理解,图7所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,服务器700还可包括比图7中所示更多或者更少的组件,或者具有与图7所示不同的配置。
需要说明的是:上述本申请实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置和服务器实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (10)

1.一种异常对象检测方法,其特征在于,所述方法包括:
获取目标对象集,所述目标对象集中包括至少一个成员变量;
对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据;
遍历所述语法树结构数据,得到每个成员变量的属性信息;
基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数;
基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
2.根据权利要求1所述的方法,其特征在于,所述对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据,包括:
对所述目标对象集中的字符进行词法分析,得到与所述目标对象集对应的词法单词序列;
对所述词法单词序列进行语法分析,得到与所述目标对象集对应的多条语句;
基于得到的所述多条语句,构建与所述目标对象集对应的语法树结构数据。
3.根据权利要求1所述的方法,其特征在于,所述语法树结构数据包括至少一个节点,每个节点均被设置为支持一个统一的访问者模式接口,则所述遍历所述语法树结构数据,得到每个成员变量的属性信息,包括:
通过所述访问者模式编写变量提取公式;
通过所述变量提取公式,遍历访问所述语法树结构数据中的每个节点;
基于遍历结果,得到每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息。
4.根据权利要求3所述的方法,其特征在于,所述基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数,包括:
基于每个成员变量的定义信息、调用信息以及判空信息,统计所述成员变量被所述目标对象集中的对象调用的调用总次数以及调用前进行空指针判定操作的判空总次数。
5.根据权利要求4所述的方法,其特征在于,所述基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果,包括:
基于每个成员变量的判空总次数与第一阈值的和,得到与所述成员变量对应的第一判断值;
基于每个成员变量的调用总次数与第一阈值的和,得到与所述成员变量对应的第二判断值;
当所述第一判断值与所述第二判断值的商大于第二阈值,则获取调用所述成员变量但调用前未进行空指针判定操作的对象;
将所述调用所述成员变量但调用前未进行空指针判定操作的对象,确定为需要进行空指针判定操作的目标对象。
6.根据权利要求5所述的方法,其特征在于,在得到需要进行空指针判定操作的目标对象之后,所述方法还包括:
对所述目标对象进行空指针判定操作。
7.一种异常对象检测装置,其特征在于,所述装置包括:
第一获取模块,用于获取目标对象集,所述目标对象集中包括至少一个成员变量;
分析模块,用于对所述目标对象集进行词法分析和语法分析,得到与所述目标对象集对应的语法树结构数据;
第二获取模块,用于遍历所述语法树结构数据,得到每个成员变量的属性信息;
第三获取模块,用于基于每个成员变量的属性信息,得到所述成员变量的调用次数以及调用前进行空指针判定操作的判空次数;
确定模块,用于基于得到的每个成员变量的调用次数以及判空次数,确定所述目标对象集中的异常对象检测结果。
8.根据权利要求7所述的装置,其特征在于,所述语法树结构数据包括至少一个节点,每个节点均被设置为支持一个统一的访问者模式接口,则所述第二获取模块进一步包括:
编写单元,用于通过所述访问者模式编写变量提取公式;
遍历单元,用于通过所述变量提取公式,遍历访问所述语法树结构数据中的每个节点;
信息获取单元,用于基于遍历结果,得到每个成员变量的定义信息、每个成员变量被所述目标对象集中的多个对象分别调用的调用信息以及每个成员变量被所述目标对象集中的多个对象分别调用前是否进行空指针判定操作的判空信息。
9.一种设备,其特征在于,所述设备包括:处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1-6任一所述的异常对象检测方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1-6任一所述的异常对象检测方法。
CN201910503271.1A 2019-06-11 2019-06-11 一种异常对象检测方法、装置、设备及存储介质 Active CN112069052B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910503271.1A CN112069052B (zh) 2019-06-11 2019-06-11 一种异常对象检测方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910503271.1A CN112069052B (zh) 2019-06-11 2019-06-11 一种异常对象检测方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN112069052A true CN112069052A (zh) 2020-12-11
CN112069052B CN112069052B (zh) 2024-04-12

Family

ID=73658646

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910503271.1A Active CN112069052B (zh) 2019-06-11 2019-06-11 一种异常对象检测方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN112069052B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114347039A (zh) * 2022-02-14 2022-04-15 北京航空航天大学杭州创新研究院 机器人控制方法及相关装置
CN117149663A (zh) * 2023-10-30 2023-12-01 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质
WO2024113786A1 (zh) * 2022-11-30 2024-06-06 华为技术有限公司 一种提升内存安全的方法、装置及计算设备

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101847122A (zh) * 2010-06-01 2010-09-29 北京邮电大学 应用异常控制流集的软件测试方法及系统
US20110321017A1 (en) * 2010-06-29 2011-12-29 International Business Machines Corporation Computer code debugging method and apparatus providing exception breakpoints
CN103955426A (zh) * 2014-04-21 2014-07-30 中国科学院计算技术研究所 一种检测c代码空指针引用的方法及系统
US20140282444A1 (en) * 2013-03-15 2014-09-18 ArtinSoft Corporation Programming language transformations with abstract syntax tree extensions
US20160147640A1 (en) * 2014-11-25 2016-05-26 The Board Of Trustees Of The University Of Illinois Maximizing concurrency bug detection in multithreaded software programs
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置
US20170262360A1 (en) * 2016-03-08 2017-09-14 International Business Machines Corporation Analyzing software test failures using natural language processing and machine learning
CN107463486A (zh) * 2017-07-05 2017-12-12 东软集团股份有限公司 系统性能分析方法、装置及服务器
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101847122A (zh) * 2010-06-01 2010-09-29 北京邮电大学 应用异常控制流集的软件测试方法及系统
US20110321017A1 (en) * 2010-06-29 2011-12-29 International Business Machines Corporation Computer code debugging method and apparatus providing exception breakpoints
US20140282444A1 (en) * 2013-03-15 2014-09-18 ArtinSoft Corporation Programming language transformations with abstract syntax tree extensions
CN103955426A (zh) * 2014-04-21 2014-07-30 中国科学院计算技术研究所 一种检测c代码空指针引用的方法及系统
US20160147640A1 (en) * 2014-11-25 2016-05-26 The Board Of Trustees Of The University Of Illinois Maximizing concurrency bug detection in multithreaded software programs
US20170262360A1 (en) * 2016-03-08 2017-09-14 International Business Machines Corporation Analyzing software test failures using natural language processing and machine learning
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置
CN107463486A (zh) * 2017-07-05 2017-12-12 东软集团股份有限公司 系统性能分析方法、装置及服务器
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
傅玉等: "面向二进制程序的空指针解引用错误的检测方法", 计算机学报, no. 03, 19 April 2017 (2017-04-19) *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114347039A (zh) * 2022-02-14 2022-04-15 北京航空航天大学杭州创新研究院 机器人控制方法及相关装置
CN114347039B (zh) * 2022-02-14 2023-09-22 北京航空航天大学杭州创新研究院 机器人前瞻控制方法及相关装置
WO2024113786A1 (zh) * 2022-11-30 2024-06-06 华为技术有限公司 一种提升内存安全的方法、装置及计算设备
CN117149663A (zh) * 2023-10-30 2023-12-01 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质
CN117149663B (zh) * 2023-10-30 2024-02-02 合肥中科类脑智能技术有限公司 多目标检测算法的部署方法、装置、电子设备和介质

Also Published As

Publication number Publication date
CN112069052B (zh) 2024-04-12

Similar Documents

Publication Publication Date Title
CN110502227B (zh) 代码补全的方法及装置、存储介质、电子设备
CN111382070B (zh) 兼容性测试方法、装置、存储介质和计算机设备
EP3623948B1 (en) Method and system for code analysis to identify causes of code smells
CN108920370B (zh) 兼容性问题检测方法、装置及设备
CN112069052B (zh) 一种异常对象检测方法、装置、设备及存储介质
CN106295346B (zh) 一种应用漏洞检测方法、装置及计算设备
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
CN112181430A (zh) 代码变更统计方法、装置、电子设备及存储介质
CN116340940A (zh) 代码识别方法、终端设备及存储介质
CN116560683A (zh) 软件更新方法、装置、设备及存储介质
CN115238138A (zh) 一种图数据查询方法及装置
CN116661758B (zh) 一种优化日志框架配置的方法、装置、电子设备及介质
CN114115884B (zh) 一种编程服务的管理方法以及相关装置
WO2023206873A1 (zh) 基于抽象语法树的代码检测方法、装置、设备及存储介质
CN107451050B (zh) 函数获取方法和装置、服务器
CN115421831A (zh) 生成活动组件调用关系的方法、装置、设备及存储介质
CN115292178A (zh) 测试数据搜索方法、装置、存储介质以及终端
CN113138767B (zh) 代码语言转换方法、装置、电子设备及存储介质
CN114706586A (zh) 代码编译、代码运行方法、装置、计算机设备及存储介质
CN113419738A (zh) 接口文档的生成方法、装置及接口管理设备
CN112306493A (zh) 热修复补丁生成方法、装置、存储介质及计算机设备
CN112433943A (zh) 基于抽象语法树的环境变量检测方法、装置、设备及介质
CN110321130A (zh) 基于系统调用日志的不可重复编译定位方法
CN118708172A (zh) 用于sast的函数调用图构建方法、装置及存储介质
CN116661792A (zh) 一种代码检验方法、装置、设备及存储介质、程序产品

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
GR01 Patent grant
GR01 Patent grant