CN111881059B - 代码文件的检测方法、装置和电子设备 - Google Patents

代码文件的检测方法、装置和电子设备 Download PDF

Info

Publication number
CN111881059B
CN111881059B CN202010798336.2A CN202010798336A CN111881059B CN 111881059 B CN111881059 B CN 111881059B CN 202010798336 A CN202010798336 A CN 202010798336A CN 111881059 B CN111881059 B CN 111881059B
Authority
CN
China
Prior art keywords
code
attribute
file
line
target
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.)
Active
Application number
CN202010798336.2A
Other languages
English (en)
Other versions
CN111881059A (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.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network 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 Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN202010798336.2A priority Critical patent/CN111881059B/zh
Publication of CN111881059A publication Critical patent/CN111881059A/zh
Application granted granted Critical
Publication of CN111881059B publication Critical patent/CN111881059B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/362Software debugging
    • G06F11/3628Software debugging of optimised code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明提供了一种代码文件的检测方法、装置和电子设备。该方法包括:从目标代码中查找目标代码行;如果目标代码行的属性字符串对应的属性为对象类型,检查目标代码行是否包含有对象类型对应的预设修饰符标识;如果否,确定目标代码行异常。该方式中在目标代码中查找以属性字符串开头的目标代码行,如果目标代码行对应的属性为对象类型,且目标代码行不包含对象类型对应的预设修饰符标识,则确定目标代码行异常。不需要使用脚本额外分析类的引用关系,也不需要使用编译器拖慢构建速度,只需要在正常的构建流程的基础上,简单地通过代码分析二进制代码文件,就能够实现异常的属性检测,可以提高代码检测的检测速度,增加代码检测的准确率。

Description

代码文件的检测方法、装置和电子设备
技术领域
本发明涉及代码检测技术领域,尤其是涉及一种代码文件的检测方法、装置和电子设备。
背景技术
在基于Objective-C编程语言开发的程序中,对象的生命周期使用引用计数机制控制,即程序每次申请对象所有权,都会使对象的引用计数加一,释放对象所有权时引用计数减一。当引用计数降为零时,该对象占用的内存地址就会被回收,从而释放该对象。其中,可以通过给对象赋予属性(setter)的方法为对象设置正确的内存管理语义修饰符,当内存管理语义修饰符没有被修改时对象不会被释放。
可以通过下述两种方法检测为对象设置的内存管理语义修饰符是否正确,第一种方法是通过脚本分析程序中所有的代码文件,在构建项目的时候,分析所有的代码文件,遍历每一个类的声明和类的扩展,通过正则表达式匹配等手段,找到代码文件中所有对象包括的属性,分析每个属性的修饰符与该属性的类型是否匹配。这种方法需要消耗较长的时间建立完整的类关系网络,对于使用宏、类型定义等方式声明的属性难以准确地判断出原本的类型,导致准确率下降。第二种方法是通过编译器插件遍历代码文件的抽象语法树的Objective-C属性节点,判断属性的内存管理语义修饰符是否正确。这种方法需要程序员自己编译编译器插件,然而编译器插件的编译速度较慢,编译器插件接入代码文件的过程也较为繁琐,消耗的时间较长。
发明内容
有鉴于此,本发明的目的在于提供一种代码文件的检测方法、装置和电子设备,以提高代码检测的检测速度,增加代码检测的准确率。
第一方面,本发明实施例提供了一种代码文件的检测方法,方法包括:从目标代码中查找目标代码行;其中,目标代码为代码文件编译后的代码,目标代码行为以属性字符串开头的代码行;如果目标代码行的属性字符串对应的属性为对象类型,检查目标代码行是否包含有对象类型对应的预设修饰符标识;如果否,确定目标代码行对应的代码文件异常。
在本发明较佳的实施例中,上述从目标代码中查找目标代码行的步骤之后,方法还包括:检查目标代码行的属性字符串是否为第一字符串;其中,第一字符串为对象类型的代码进行编译后的字符串;如果是,确定目标代码行的属性字符串对应的属性为对象类型。
在本发明较佳的实施例中,上述预设修饰符标识为对象类型对应的预设代码经编译器编译后的字符和/或字符串。
在本发明较佳的实施例中,上述检查目标代码行是否包含有对象类型对应的预设修饰符标识的步骤,包括以下至少之一:检查目标代码行在预设长度范围内是否包含有对象类型对应的预设修饰符标识;检查目标代码行的指定标点符号之前的代码中是否包含有对象类型对应的预设修饰符标识。
在本发明较佳的实施例中,上述从目标代码中查找目标代码行的步骤,包括:从目标代码中查找目标代码中类的属性列表;从属性列表的预设位置确定目标代码行的地址;基于目标代码行的地址查找目标代码行。
在本发明较佳的实施例中,上述从目标代码中查找目标代码中类的属性列表的步骤,包括:获取目标代码的文件头;从文件头中的预设位置读取加载命令信息;从加载命令信息中确定目标代码在编译后生成的类列表的地址,并基于类列表的地址读取类列表;从类列表中读取类的属性列表的地址,并基于类的属性列表的地址读取类的属性列表。
在本发明较佳的实施例中,上述从目标代码中查找目标代码中类的属性列表的步骤,包括:通过预设的动态链接器接口从目标代码中查找类的属性列表;其中,动态链接器接口的头文件包含多个函数,函数用于读取目标代码的文件头、类列表或类的属性列表。
在本发明较佳的实施例中,上述目标代码为基于Objective-C语言编写的文件;上述从目标代码中查找目标代码行的步骤,包括:在运行目标代码时,通过property_getAttributes函数查找目标代码行。
在本发明较佳的实施例中,上述确定目标代码行对应的代码文件异常的步骤之后,方法还包括:输出表征目标代码行异常的错误提示信息。
第二方面,本发明实施例还提供一种代码文件的检测装置,装置包括:目标代码行查找模块,用于从目标代码中查找目标代码行;其中,目标代码为代码文件编译后的代码,目标代码行为以属性字符串开头的代码行;修饰符标识检查模块,用于如果目标代码行的属性字符串对应的属性为对象类型,检查目标代码行是否包含有对象类型对应的预设修饰符标识;目标代码行异常确定模块,用于如果否,确定目标代码行对应的代码文件异常。
第三方面,本发明实施例还提供一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的计算机可执行指令,处理器执行计算机可执行指令以实现上述的代码文件的检测方法的步骤。
第四方面,本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质存储有计算机可执行指令,计算机可执行指令在被处理器调用和执行时,计算机可执行指令促使处理器实现上述的代码文件的检测方法的步骤。
本发明实施例带来了以下有益效果:
本发明实施例提供的一种代码文件的检测方法、装置和电子设备,在目标代码中查找以属性字符串开头的目标代码行,如果目标代码行对应的属性为对象类型,且目标代码行不包含对象类型对应的预设修饰符标识,则确定目标代码行异常。该方式不需要使用脚本额外分析类的引用关系,也不需要使用编译器拖慢构建速度,只需要在正常的构建流程的基础上,简单地通过代码分析二进制代码文件,就能够实现异常的属性检测,可以提高代码检测的检测速度,增加代码检测的准确率。
本公开的其他特征和优点将在随后的说明书中阐述,或者,部分特征和优点可以从说明书推知或毫无疑义地确定,或者通过实施本公开的上述技术即可得知。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种代码文件的检测方法的流程图;
图2为本发明实施例提供的另一种代码文件的检测方法的流程图;
图3为本发明实施例提供的一种代码文件的检测装置的结构示意图;
图4为本发明实施例提供的另一种代码文件的检测装置的结构示意图;
图5为本发明实施例提供的另一种代码文件的检测装置的结构示意图;
图6为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
目前,在面向对象编程的语言中,存在类、实例变量等概念,在Objective-C语言中亦然,而Objective-C语言中还有一个属性(property)的概念,一般来说,声明属性等同于定义实例变量以及其存取方法,即编译器按照特定规则合成实例变量,并且自动增加setter和通过属性调出对象(getter)方法。
结合引用计数机制以及属性概念,可以知道编译器在为属性生成setter方法的时候,需要正确的内存管理语义修饰符提供指导,为其生成正确的内存管理代码。否则可能导致给对象设置属性后,该属性就被释放。而在后续对该属性的访问中,可能会产生错误内存访问导致崩溃等其它异常。比如,在ARC(Automatic Reference Counting,自动引用计数)环境下,使用strong修饰符修饰一个名称为messageId的属性,编译器为该属性生成的setter方法(-setMessageId:)中,内部会插入objc_storeStrong函数,获得该参数对象的所有权,表示需要对象存在,不能被释放掉;当修饰符由strong改为assign的时候,setter方法内部不再获得参数对象的所有权,该对象会在下一个自被释放,导致从程序可能异常。之所以是可能而非绝对,是因为被释放后内存区域的内容可能还没修改,此时还有可当做一个正常的对象使用。
因此需要检测为对象设置的内存管理语义修饰符是否正确。其中,使用脚本分析源代码的方式,需要遍历所有的源代码文件、构造类与类之间的继承关系网络,还要建立白名单排除系统提供的框架类,对于使用typedef关键字定义的类型,还需要额外的分析机制。此方案的缺点在于:建立完整的类关系网络非常地耗时,对于使用宏、类型定义等方式声明的属性较难正确地判断出原本的类型导致准确率下降。而使用编译器插件的方式,可以在正常的构建流程中嵌入分析属性,但是需要使用自己编译出来的编译器,编译速度慢、接入繁琐,不能及时与其他厂商的编译器进行同步。
基于此,本发明实施例提供的一种代码文件的检测方法、装置和电子设备,可以应用于服务器、电脑、手机、平板电脑等可以实现人机交互的电子设备上,尤其可以适用于Objective-C语言环境下的内存管理语义修饰符的分析场景中。
为便于对本实施例进行理解,首先对本发明实施例所公开的一种代码文件的检测方法进行详细介绍。
本实施例提供了一种代码文件的检测方法,参见图1所示的一种代码文件的检测方法的流程图,该代码文件的检测方法包括如下步骤:
步骤S102,从目标代码中查找目标代码行;其中,目标代码为代码文件编译后的代码,目标代码行为以属性字符串开头的代码行。
本实施例中的目标代码可以为对代码文件编译后的二进制代码文件,其中,代码文件可以通过Objective-C语言编写。可以在通过Objective-C语言编写代码文件后,由编译器编译该二进制代码文件文件,得到上述目标代码中。目标代码中包括多个代码行,可以将代码行中以属性字符串开头的代码行作为目标代码行。例如:代码行“T@"NSString",&,V_sStr”,如果属性字符串设定为“T@”,则说明该代码行以属性字符串开头,则该代码行为目标代码行。
步骤S104,如果目标代码行的属性字符串对应的属性为对象类型,检查目标代码行是否包含有对象类型对应的预设修饰符标识。
从目标代码中查找目标代码行之后,可以确定每一个查找到的目标代码行对应的属性是否为对象类型。对于目标代码行,其属性可以为对象类型(例如字符串NSString)或者基本属性类型(例如整形int)。其中,可以通过目标代码行中的属性字符串确定目标代码行的属性。属性字符串可以为表征属性的代码通过编译得到的,因此,可以通过属性字符串确定目标代码行的属性。
在确定目标代码行的属性为对象类型之后,由于代码文件中的为属性设定了修饰符,因此可以确定目标代码中的属性与修饰符是否匹配。其中,修饰符也可以称为内存管理语义修饰符。对举例来说,假设内存管理语义修饰符共有四种:assign、strong、copy和weak。属性为对象类型的代码文件可以匹配strong、copy和weak这三种修饰符,而属性为基础数据类型的代码文件可以匹配全部的四种修饰符。
其中,对象类型(例如NSString就是一种对象类型)的修饰符一般出于特定的目的(强引用、弱引用或者拷贝)会使用特定的(对应strong,weak以及copy)修饰符。但是不会使用assign修饰,理由是assign只拷贝对象的地址,不管理对象的生命周期,运行期间容易出现内存错误。而@property(assign)int iVar中为基本数据类型(例如int是一种基本数据类型)其生命周期(该地址的有效周期)跟随所处类的对象的生命周期,不需要类似对象类型的内存管理方式,只需要简单的内存赋值即可,可以使用assign修饰。
步骤S106,如果否,确定目标代码行对应的代码文件异常。
因此,可以首先确定目标代码行对应的属性为对象类型,然后检查该目标代码行是否包含有对象类型对应的预设修饰符标识。如果该目标代码行包含有对象类型对应的预设修饰符标识(对于上述例子,就是strong、copy和weak这三种修饰符对应的修饰符标识),则说明该目标代码行对应的代码文件没有异常;如果该目标代码行不包含有对象类型对应的预设修饰符标识,则说明该目标代码行对应的代码文件有异常,存在代码文件中的属性与修饰符不匹配的问题。
本发明实施例提供的一种代码文件的检测方法,在目标代码中查找以属性字符串开头的目标代码行,如果目标代码行对应的属性为对象类型,且目标代码行不包含对象类型对应的预设修饰符标识,则确定目标代码行异常。该方式不需要使用脚本额外分析类的引用关系,也不需要使用编译器拖慢构建速度,只需要在正常的构建流程的基础上,简单地通过代码分析二进制代码文件,就能够实现异常的属性检测,可以提高代码检测的检测速度,增加代码检测的准确率。
本实施例提供了另一种代码文件的检测方法,该方法在上述实施例的基础上实现;本实施例重点描述确定目标代码行的属性字符串对应的属性的具体实施方式。如图2所示的另一种代码文件的检测方法的流程图,本实施例中的代码文件的检测方法包括如下步骤:
步骤S202,从目标代码中查找目标代码行;其中,目标代码为代码文件编译后的代码,目标代码行为以属性字符串开头的代码行。
本实施例中以基于Objective-C语言编写代码文件为例,代码文件的类在经过编译器编译得到目标代码(即代码文件也为基于Objective-C语言编写的文件)后,目标代码可以对属性产生类型编码字符串(即本实施例中的属性字符串),这些类型编码可以指示出该属性的原子性、内存管理语义等特征。通过目标代码在运行时分析二进制所有类的属性特征,可以快速准确地找出所有的异常属性。
举例来说,编译为目标代码的代码文件可以通过以下代码标识:
@interface KTClass:NSObject;
@property(assign)int iVar;
@property(assign)NSString*aStr;
@property(strong)NSString*sStrr;
@property(copy)NSString*cStr;
@property(weak)NSString*wStr;
@end。
其中,分析代码文件可以看出,共包含四种内存管理语义修饰符:assign、strong、copy和weak。在上述七行代码中,@interface和@end这两行是这个类KTClass的定义所使用关键字,与本实施例需要说明的目标代码行无关,因此编译后可以忽略(不以属性字符串开头)。在运行目标代码时,可以通过property_getAttributes函数查找目标代码行,通过下述代码表示:
Ti,V_iVar;
T@"NSString",V_aStr;
T@"NSString",&,V_sStr;
T@"NSString",C,V_cStr;
T@"NSString",W,V_wStr。
本发明实施例提供的上述方法,可以通过property_getAttributes函数快速、准确地查找目标代码行,可以避免接入流程复杂、编译速度降低等问题。
其中,“Ti,V_iVar”为“@property(assign)int iVar”经过编译后得到;“T@"NSString",V_aStr”为“@property(assign)NSString*aStr”经过编译后得到;“T@"NSString",&,V_sStr”为“@property(strong)NSString*sStrr”经过编译后得到;“T@"NSString",C,V_cStr”为“@property(copy)NSString*cStr”经过编译后得到;“T@"NSString",W,V_wStr”为“@property(weak)NSString*wStr”经过编译后得到。
其中,属性字符串可以为“T”。即由于上述5行代码均以属性字符串“T”开头,则上述5行代码可以为目标代码行。而@interface和@end这两行代码文件对应的目标代码中,不以属性字符串“T”开头,则不为目标代码行。
具体来说,可以通过直接读取编译产物中的特征字符串,或者静态解析代码文件的方式从目标代码中查找目标代码行。其中,二者的基础步骤类似,可以通过下述步骤A1-步骤A3执行:
步骤A1,从目标代码中查找目标代码中类的属性列表。
对于通过直接读取编译产物中的特征字符串的方式,可以通过下述步骤直接读取目标代码中类的属性列表:通过预设的动态链接器(The Dynamic Linker,dyld)接口(API)从目标代码中查找类的属性列表;其中,动态链接器接口的头文件包含多个函数,函数用于读取目标代码的文件头、类列表或类的属性列表。
其中,dyld是用于加载代码文件、链接动态库的程序。应用程序的代码和数据一般都是由dyld加载到内存中并执行的。dyld的头文件提供一些函数,用于读取代码文件的数据等其它功能。
具体来说,首先通过_dyld_get_image_header函数获得对应的二进制的文件头,文件头包括该目标代码的元信息,比如该目标代码所支持的CPU类型,所有加载命令的大小。然后再通过getsectiondata函数获得__DATA段中的__objc_classlist段,这里返回的是编译期生成的所有类列表,__objc_classlist包括该目标代码中,所有编译好的Objective-C的类列表,例如:从0x1000040e8开始是一个指向类地址的列表。最后可以遍历类列表再通过class_copyPropertyList函数获取到类的所有属性列表,如果通过class_copyPropertyList函数得到的属性列表是一个不透明的结构体数组,通过编译后查看二进制可以发现属性列表。
本发明实施例提供的上述方法,可以通过预设的动态链接器接口从目标代码中查找类的属性列表,由于动态链接器接口的头文件供的函数可以用于读取代码文件的数据等其它功能,因此,通过上述函数可以准确地从目标代码中查找类的属性列表,无需使用编译器,可以增加查找类的属性列表的速度。
对于静态解析代码文件的方式,可以通过步骤B1-步骤B4从目标代码中查找目标代码中类的属性列表:
步骤B1,获取目标代码的文件头。
步骤B2,从文件头中的预设位置读取加载命令信息。
在获取目标代码的文件头后,读取文件头的固定长度,可以读取LoadCommands(即加载命令信息,用于指导二进制各个字段section加载位置)。
步骤B3,从加载命令信息中确定目标代码在编译后生成的类列表的地址,并基于类列表的地址读取类列表。
在LoadCommands中可以找到__objc_classlist类列表这个section的地址,例如,__objc_classlist在地址0x1000040e8处。
步骤B4,从类列表中读取类的属性列表的地址,并基于类的属性列表的地址读取类的属性列表。
举例来说,可以读取__objc_classlist开始的所有类定义,举例来说,第一个类可以为_OBJC_CLASS_$KTClass(这是一个地址,被软件解析成了可读的符号)。跳转到_OBJC_CLASS_$KTClass这个结构体定义后,再跳转到__OBJC_CLASS_RO_$_KTClass这个编译期生成的信息。跳转到__OBJC_CLASS_RO_$_KTClass这个结构体定义后,再跳转到__OBJC_$_PROP_LIST_KTClass这个编译期生成的信息,最后在__OBJC_$_PROP_LIST_KTClass中,可以获得所有的属性列表。
步骤A2,从属性列表的预设位置确定目标代码行的地址。
目标代码行并非属性列表,而是属性列表中每一项属性中的特征字符串所组成的列表。在属性列表预设位置标注了目标代码行的地址,因此可以直接从预设位置读取目标代码行的地址。例如:每个属性列表结构体的第二个地址指向的就是该属性的目标代码行。以一个属性列表__objc_property为例,其中0x100005330的两个成员变量,为0x100003ce3和0x100003ce8,二者分别为是两个字符串常量“aStr”和“T@”NSString”,V_aStr”的地址。
步骤A3,基于目标代码行的地址查找目标代码行。
在读取目标代码行的地址之后,可以根据该地址从目标代码中查找目标代码行。本实施例提供的上述方法,为了减少对Objective-C类的额外分析,可以通过Objective-C运行时的动态链接器接口获取属性的特征字符串,从而判断该属性是否合规。为了避免接入流程复杂、编译速度降低等问题,采用运行时读取二进制数据的方式分析,而不是使用编译器插件在编译的过程中分析,可以快速、准确地查找目标代码行。
本发明实施例提供的上述方法,除了可以在程序运行期间使用动态链接器接口获得该特征字符串,也可以静态地通过解析代码文件获得,同样无需使用编译器,也可以增加查找类的属性列表的速度。
步骤S204,检查目标代码行的属性字符串是否为第一字符串;其中,第一字符串为对象类型的代码进行编译后的字符串。如果是,则执行步骤S206;如果否,则结束。
第一字符串为对象类型的代码进行编译后的字符串,只有属性字符串为第一字符串的目标代码行,才可以确定该目标代码行的属性字符串对应的属性为对象类型。
步骤S206,确定目标代码行的属性字符串对应的属性为对象类型。
以之前提到的目标代码和代码文件为例,代码文件中的“NSString”为对象类型的代码,“int”为基础数据类型的代码。“NSString”和“int”进行编译后的第一字符串分别为“NSString”和“V”,由于代码文件中的“@interface KTClass:NSObject”、“@end”经过编译的目标代码不包括属性字符串,“@property(assign)int iVar”经过编译的目标代码中的属性字符串为“V”,而非第一字符串“NSString”。
因此,在上述例子中的目标代码中,属性字符串对应的属性为对象类型的目标代码行包括:“T@"NSString",V_aStr”、“T@"NSString",&,V_sStr”、“T@"NSString",C,V_cStr”和“T@"NSString",W,V_wStr”。
步骤S208,检查目标代码行是否包含有对象类型对应的预设修饰符标识。如果是,则结束;如果否,则执行步骤S210。
目标代码行中的修饰符标识表征了对应的代码文件中属性对应的属性内存管理语义修饰符。因此,预设修饰符标识可以为对象类型对应的预设代码经编译器编译后的字符和/或字符串。
仍以上文提到的例子进行说明,对于下述三种内存管理语义修饰符strong、copy和weak分别经编译器编译,可以依次得到下述四种字符和/或字符串:“&”、“C”和“W”;而内存管理语义修饰符assign经编译器编译不会得到字符和/或字符串。
因此,检查目标代码行是否包含有对象类型对应的预设修饰符标识的步骤,可以理解为检查目标代码行中包含的预设修饰符标识是否有与内存管理语义修饰符相匹配,包括以下步骤C1-步骤C2至少之一:
步骤C1,检查目标代码行在预设长度范围内是否包含有对象类型对应的预设修饰符标识。
检查目标代码行的预设长度范围(例如20个字符)内是否包含对象类型对应的预设修饰符标识,例如:以目标代码行“T@"NSString",V_aStr”为例,该目标代码行的属性为对象,对象对应的内存管理语义修饰符可以为strong、copy或weak,预设修饰符标识可以为“&”、“C”或者“W”。该目标代码行在预设长度范围(例如20个字符)内不包含上述3个预设修饰符标识。
步骤C2,检查目标代码行的指定标点符号之前的代码中是否包含有对象类型对应的预设修饰符标识。
可以在目标代码行的指定标点符号(例如最后一个逗号)之前的代码中查找对象类型对应的预设修饰符标识,例如:以目标代码行“T@"NSString",&,V_sStr”、“T@"NSString",C,V_cStr”和“T@"NSString",W,V_wStr”为例,上述3个目标代码行在最后一个逗号前包括对象类型对应的预设修饰符标识“&”、“C”或“W”,因此上述3个目标代码行的指定标点符号之前的代码中均包含有对象类型对应的预设修饰符标识。
本发明实施例提供的上述方法,可以在目标代码行的预设长度范围内或者目标代码行的指定标点符号之前的代码中检查是否包含有对象类型对应的预设修饰符标识,从而检查目标代码行是否包含有对象类型对应的预设修饰符标识。此外需要说明的是,检查目标代码行是否包含有对象类型对应的预设修饰符标识的方式不仅包括上述两种方式,并且上述两种方式也可以同时使用。
步骤S210,确定目标代码行对应的代码文件异常。
如果目标代码行不包含有对象类型对应的预设修饰符标识,则说明代目标代码行中的属性和属性内存管理语义修饰符并不匹配,该目标代码行异常。如果目标代码行异常,可以对代码文件的编写人员或者维护人员进行报错,通过下述步骤执行:输出表征目标代码行异常的错误提示信息。
本实施例中的错误提示信息表征某行目标代码行出现了异常,将该异常的具体内容(例如目标代码行的地址、报错的原因、报错的时间等)发送给代码文件的编写人员或者维护人员,以使代码文件的编写人员或者维护人员对目标代码行进行修改。
现针对具体的目标代码分析其中的目标代码行是否存在异常,首先确定编译前的二进制文如下:
@interface KTClass:NSObject;
@property(assign)int iVar;
@property(assign)NSString*aStr;
@property(strong)NSString*sStrr;
@property(copy)NSString*cStr;
@property(weak)NSString*wStr;
@end。
对上述7行代码进行编译,其中,属性可以为“T”。@interface和@end这两行代码文件进行编译得到的目标代码中,不以属性字符串“T”开头,则不为目标代码行。其余5行代码进行编译得到的目标代码中,以属性字符串“T”开头,可以为目标代码行,通过下述代码表示:
Ti,V_iVar;
T@"NSString",V_aStr;
T@"NSString",&,V_sStr;
T@"NSString",C,V_cStr;
T@"NSString",W,V_wStr。
在上述5行目标代码行中,“Ti,V_iVar”的属性字符串“V”并不是第一字符串“NSString”,因此“Ti,V_iVar”对应的属性不是对象类型,属性字符串对应的属性为对象类型的目标代码行包括:“T@"NSString",V_aStr”、“T@"NSString",&,V_sStr”、“T@"NSString",C,V_cStr”和“T@"NSString",W,V_wStr”。由于对象类型的内存管理语义修饰符只可以为:strong、copy或weak,strong、copy和weak分别经编译器编译,可以依次得到下述四种字符和/或字符串:“&”、“C”和“W”;而内存管理语义修饰符assign经编译器编译不会得到字符和/或字符串。
在目标代码行“T@"NSString",V_aStr”中,该目标代码行的属性为对象,该目标代码行不包含上述3个预设修饰符标识“&”、“C”和“W”,因此,目标代码行“T@"NSString",V_aStr”异常。
在目标代码行“T@"NSString",&,V_sStr”、“T@"NSString",C,V_cStr”和“T@"NSString",W,V_wStr”中,上述3个目标代码行包含对象类型对应的预设修饰符标识“&”、“C”或“W”,因此,目标代码行“T@"NSString",&,V_sStr”、“T@"NSString",C,V_cStr”和“T@"NSString",W,V_wStr”无异常。
综上,对于该目标代码,需要针对目标代码行“T@"NSString",V_aStr”报错,即输出错误提示信息,错误提示信息可以包括目标代码行的地址、报错的原因、报错的时间等。
本发明实施例提供的上述方法,在实践中可以成功定位到软件项目中潜在的或偶现的内存隐患,一定程度上提高了项目质量。直接读取编译产物中的特征字符串,快捷、准确,解决了使用脚本扫描分析的困难(效率低、类型关系网不明确);通过运行时的代码去检测,可以避免使用插件带来的编译速度慢的问题,而且很容易地能够根据debug(调试)或者release(发布)环境配置是否加载本案的检测代码。
需要说明的是,上述各方法实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
对应于上述方法实施例,本发明实施例提供了一种代码文件的检测装置,如图3所示的一种代码文件的检测装置的结构示意图,该代码文件的检测装置包括:
目标代码行查找模块31,用于从目标代码中查找目标代码行;其中,目标代码行为以属性字符串开头的代码行;
修饰符标识检查模块32,用于如果目标代码行的属性字符串对应的属性为对象类型,检查目标代码行是否包含有对象类型对应的预设修饰符标识;
目标代码行异常确定模块33,用于如果否,确定目标代码行对应的代码文件异常。
本发明实施例提供的一种代码文件的检测装置,在目标代码中查找以属性字符串开头的目标代码行,如果目标代码行对应的属性为对象类型,且目标代码行不包含对象类型对应的预设修饰符标识,则确定目标代码行异常。该方式不需要使用脚本额外分析类的引用关系,也不需要使用编译器拖慢构建速度,只需要在正常的构建流程的基础上,简单地通过代码分析二进制代码文件,就能够实现异常的属性检测,可以提高代码检测的检测速度,增加代码检测的准确率。
参见图4所示的另一种代码文件的检测装置的结构示意图,上述代码文件的检测装置还包括属性字符串检测模块34,与目标代码行查找模块31和修饰符标识检查模块32连接,用于检查目标代码行的属性字符串是否为第一字符串;其中,第一字符串为对象类型的代码进行编译后的字符串;如果是,确定目标代码行的属性字符串对应的属性为对象类型。
上述预设修饰符标识为对象类型对应的预设代码经编译器编译后的字符和/或字符串。
上述修饰符标识检查模块,至少用于以下之一:检查目标代码行在预设长度范围内是否包含有对象类型对应的预设修饰符标识;检查目标代码行的指定标点符号之前的代码中是否包含有对象类型对应的预设修饰符标识。
上述目标代码行查找模块,用于从目标代码中查找目标代码中类的属性列表;从属性列表的预设位置确定目标代码行的地址;基于目标代码行的地址查找目标代码行。
上述目标代码行查找模块,用于获取目标代码的文件头;从文件头中的预设位置读取加载命令信息;从加载命令信息中确定目标代码在编译后生成的类列表的地址,并基于类列表的地址读取类列表;从类列表中读取类的属性列表的地址,并基于类的属性列表的地址读取类的属性列表。
上述目标代码行查找模块,用于通过预设的动态链接器接口从目标代码中查找类的属性列表;其中,动态链接器接口的头文件包含多个函数,函数用于读取目标代码的文件头、类列表或类的属性列表。
上述代码文件为基于Objective-C语言编写的文件;上述目标代码行查找模块,用于在运行目标代码时,通过property_getAttributes函数查找目标代码行。
参见图5所示的另一种代码文件的检测装置的结构示意图,上述代码文件的检测装置还包括错误提示信息输出模块35,与目标代码行异常确定模块33连接,用于输出表征目标代码行异常的错误提示信息。
本发明实施例还提供了一种电子设备,用于运行上述代码文件的检测方法;参见图6所示的一种电子设备的结构示意图,该电子设备包括存储器100和处理器101,其中,存储器100用于存储一条或多条计算机指令,一条或多条计算机指令被处理器101执行,以实现上述代码文件的检测方法。
进一步地,图6所示的电子设备还包括总线102和通信接口103,处理器101、通信接口103和存储器100通过总线102连接。
其中,存储器100可能包含高速随机存取存储器(RAM,Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口103(可以是有线或者无线)实现该系统网元与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。总线102可以是ISA总线、PCI总线或EISA总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
处理器101可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器101中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器101可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(DigitalSignal Processor,简称DSP)、专用集成电路(Application Specific IntegratedCircuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器100,处理器101读取存储器100中的信息,结合其硬件完成前述实施例的方法的步骤。
本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令在被处理器调用和执行时,计算机可执行指令促使处理器实现上述代码文件的检测方法,具体实现可参见方法实施例,在此不再赘述。
本发明实施例所提供的代码文件的检测方法、装置和电子设备的计算机程序产品,包括存储了程序代码的计算机可读存储介质,程序代码包括的指令可用于执行前面方法实施例中的方法,具体实现可参见方法实施例,在此不再赘述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和/或装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
另外,在本发明实施例的描述中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (11)

1.一种代码文件的检测方法,其特征在于,所述方法包括:
从目标代码中查找目标代码行;其中,所述目标代码为所述代码文件编译后的代码,所述目标代码行为以属性字符串开头的代码行;所述代码文件为基于Objective-C语言编写的文件;
检查所述目标代码行的属性字符串是否为第一字符串;其中,所述第一字符串为对象类型的代码进行编译后的字符串;如果是,确定所述目标代码行的属性字符串对应的属性为对象类型;
如果所述目标代码行的属性字符串对应的属性为对象类型,检查所述目标代码行是否包含有所述对象类型对应的预设修饰符标识;
如果否,确定所述目标代码行对应的所述代码文件异常。
2.根据权利要求1所述的方法,其特征在于,所述预设修饰符标识为所述对象类型对应的预设代码经编译器编译后的字符和/或字符串。
3.根据权利要求1所述的方法,其特征在于,检查所述目标代码行是否包含有所述对象类型对应的预设修饰符标识的步骤,包括以下至少之一:
检查所述目标代码行在预设长度范围内是否包含有所述对象类型对应的预设修饰符标识;
检查所述目标代码行的指定标点符号之前的代码中是否包含有所述对象类型对应的预设修饰符标识。
4.根据权利要求1所述的方法,其特征在于,从目标代码中查找目标代码行的步骤,包括:
从目标代码中查找所述目标代码中类的属性列表;
从所述属性列表的预设位置确定目标代码行的地址;
基于所述目标代码行的地址查找所述目标代码行。
5.根据权利要求4所述的方法,其特征在于,从目标代码中查找所述目标代码中类的属性列表的步骤,包括:
获取目标代码的文件头;
从所述文件头中的预设位置读取加载命令信息;
从所述加载命令信息中确定所述目标代码在编译后生成的类列表的地址,并基于所述类列表的地址读取所述类列表;
从所述类列表中读取类的属性列表的地址,并基于所述类的属性列表的地址读取所述类的属性列表。
6.根据权利要求5所述的方法,其特征在于,从目标代码中查找所述目标代码中类的属性列表的步骤,包括:
通过预设的动态链接器接口从目标代码中查找类的属性列表;其中,所述动态链接器接口的头文件包含多个函数,所述函数用于读取目标代码的文件头、所述类列表或所述类的属性列表。
7.根据权利要求1所述的方法,其特征在于,从目标代码中查找目标代码行的步骤,包括:在运行目标代码时,通过property_getAttributes函数查找目标代码行。
8.根据权利要求1所述的方法,其特征在于,确定所述目标代码行对应的所述代码文件异常的步骤之后,所述方法还包括:
输出表征所述目标代码行异常的错误提示信息。
9.一种代码文件的检测装置,其特征在于,所述装置包括:
目标代码行查找模块,用于从目标代码中查找目标代码行;其中,所述目标代码为所述代码文件编译后的代码,所述目标代码行为以属性字符串开头的代码行;所述代码文件为基于Objective-C语言编写的文件;
属性字符串检测模块,用于检查所述目标代码行的属性字符串是否为第一字符串;其中,所述第一字符串为对象类型的代码进行编译后的字符串;如果是,确定所述目标代码行的属性字符串对应的属性为对象类型;
修饰符标识检查模块,用于如果所述目标代码行的属性字符串对应的属性为对象类型,检查所述目标代码行是否包含有所述对象类型对应的预设修饰符标识;
目标代码行异常确定模块,用于如果否,确定所述目标代码行对应的所述代码文件异常。
10.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的计算机可执行指令,所述处理器执行所述计算机可执行指令以实现权利要求1-8任一项所述的代码文件的检测方法的步骤。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令在被处理器调用和执行时,所述计算机可执行指令促使处理器实现权利要求1-8任一项所述的代码文件的检测方法的步骤。
CN202010798336.2A 2020-08-10 2020-08-10 代码文件的检测方法、装置和电子设备 Active CN111881059B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010798336.2A CN111881059B (zh) 2020-08-10 2020-08-10 代码文件的检测方法、装置和电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010798336.2A CN111881059B (zh) 2020-08-10 2020-08-10 代码文件的检测方法、装置和电子设备

Publications (2)

Publication Number Publication Date
CN111881059A CN111881059A (zh) 2020-11-03
CN111881059B true CN111881059B (zh) 2023-10-27

Family

ID=73211331

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010798336.2A Active CN111881059B (zh) 2020-08-10 2020-08-10 代码文件的检测方法、装置和电子设备

Country Status (1)

Country Link
CN (1) CN111881059B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113468564A (zh) * 2021-06-30 2021-10-01 华控清交信息科技(北京)有限公司 一种数据处理方法、装置、电子设备及存储介质

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5893913A (en) * 1996-11-12 1999-04-13 International Business Machines Corporation Method for synchronizing classes, objects, attributes and object properties across an object-oriented system
US8387020B1 (en) * 2007-07-25 2013-02-26 Google Inc. Verifying that a method has been implemented for a program written in a dynamic programming language
CN103412764A (zh) * 2013-08-30 2013-11-27 深圳市路畅科技股份有限公司 ios编程中存取器生成的方法、装置及处理器
US8918772B1 (en) * 2007-07-25 2014-12-23 Google Inc. Statically analyzing program correctness for a dynamic programming language
CN106021087A (zh) * 2015-03-23 2016-10-12 阿里巴巴集团控股有限公司 代码检测方法及装置
CN106598828A (zh) * 2015-10-14 2017-04-26 阿里巴巴集团控股有限公司 一种源代码中的无效类确定方法及装置
CN109491924A (zh) * 2018-12-21 2019-03-19 北京达佳互联信息技术有限公司 代码检测方法、装置、终端及存储介质
CN109522010A (zh) * 2018-11-22 2019-03-26 网易(杭州)网络有限公司 初始化代码添加方法及装置、存储介质、电子设备
CN109739546A (zh) * 2018-12-26 2019-05-10 深圳乐信软件技术有限公司 属性参数获取方法、装置、存储介质及服务器
KR20190062134A (ko) * 2017-11-28 2019-06-05 주식회사 엠시큐어 라이브러리 인젝션을 통한 취약점 분석 방법 및 서버
CN109857389A (zh) * 2019-01-14 2019-06-07 平安科技(深圳)有限公司 模型数据生成方法、装置、计算机设备及存储介质
CN110688307A (zh) * 2019-09-09 2020-01-14 平安普惠企业管理有限公司 JavaScript代码检测方法、装置、设备和存储介质
CN111078568A (zh) * 2019-12-20 2020-04-28 广州华多网络科技有限公司 代码规范方法、装置、计算机设备和存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130140807A1 (en) * 2011-12-06 2013-06-06 Gerald Milroy Van Dusen Clamp with spring loaded bolt to repair broken exhaust manifold flange bolts
US9110680B1 (en) * 2013-03-14 2015-08-18 Amazon Technologies, Inc. Avoiding or deferring data copies
US20150293797A1 (en) * 2014-04-14 2015-10-15 Chall Fry Methods and systems for key value observing
US9934132B2 (en) * 2015-08-31 2018-04-03 International Business Machines Corporation Determining code coverage of an application by test(S)

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5893913A (en) * 1996-11-12 1999-04-13 International Business Machines Corporation Method for synchronizing classes, objects, attributes and object properties across an object-oriented system
US8387020B1 (en) * 2007-07-25 2013-02-26 Google Inc. Verifying that a method has been implemented for a program written in a dynamic programming language
US8918772B1 (en) * 2007-07-25 2014-12-23 Google Inc. Statically analyzing program correctness for a dynamic programming language
CN103412764A (zh) * 2013-08-30 2013-11-27 深圳市路畅科技股份有限公司 ios编程中存取器生成的方法、装置及处理器
CN106021087A (zh) * 2015-03-23 2016-10-12 阿里巴巴集团控股有限公司 代码检测方法及装置
CN106598828A (zh) * 2015-10-14 2017-04-26 阿里巴巴集团控股有限公司 一种源代码中的无效类确定方法及装置
KR20190062134A (ko) * 2017-11-28 2019-06-05 주식회사 엠시큐어 라이브러리 인젝션을 통한 취약점 분석 방법 및 서버
CN109522010A (zh) * 2018-11-22 2019-03-26 网易(杭州)网络有限公司 初始化代码添加方法及装置、存储介质、电子设备
CN109491924A (zh) * 2018-12-21 2019-03-19 北京达佳互联信息技术有限公司 代码检测方法、装置、终端及存储介质
CN109739546A (zh) * 2018-12-26 2019-05-10 深圳乐信软件技术有限公司 属性参数获取方法、装置、存储介质及服务器
CN109857389A (zh) * 2019-01-14 2019-06-07 平安科技(深圳)有限公司 模型数据生成方法、装置、计算机设备及存储介质
CN110688307A (zh) * 2019-09-09 2020-01-14 平安普惠企业管理有限公司 JavaScript代码检测方法、装置、设备和存储介质
CN111078568A (zh) * 2019-12-20 2020-04-28 广州华多网络科技有限公司 代码规范方法、装置、计算机设备和存储介质

Also Published As

Publication number Publication date
CN111881059A (zh) 2020-11-03

Similar Documents

Publication Publication Date Title
US9208057B2 (en) Efficient model checking technique for finding software defects
JP4693044B2 (ja) ソースコード脆弱性検査装置
CN108459954B (zh) 应用程序漏洞检测方法和装置
CN106371997B (zh) 一种代码检查方法及装置
CN106469049B (zh) 一种文件扫描的方法及装置
CN107643893B (zh) 一种程序检测方法及装置
CN107783766B (zh) 对应用程序的文件进行清理的方法和装置
CN106295346B (zh) 一种应用漏洞检测方法、装置及计算设备
CN111694746A (zh) 面向编译型语言AS3的Flash缺陷模糊测评工具
CN111881059B (zh) 代码文件的检测方法、装置和电子设备
CN110286912B (zh) 代码检测方法、装置及电子设备
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
CN109634569B (zh) 基于注解的流程实现方法、装置、设备及可读存储介质
CN114579203A (zh) 脚本文件检查方法、装置、电子设备及存储介质
CN117076338B (zh) 基于kprobe的linux内核动态调试方法及系统
CN112631944A (zh) 基于抽象语法树的源码检测方法及装置、计算机存储介质
CN115495745B (zh) 一种基于风险函数的工业软件源代码静态检测方法及系统
US20050010895A1 (en) Software Specification Processing System
CN113127367B (zh) Android动态权限申请的缺陷检测方法
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
CN114895914A (zh) 日志输出代码的生成方法、装置、电子设备及存储介质
CN114816364A (zh) 基于Swagger动态生成范本文件的方法、装置及应用
CN111399842A (zh) 一种代码编译方法及装置
Fischler et al. Automatic identification of standard template algorithms in raw loops
CN111273944B (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