CN105677559B - 一种检测方法及装置 - Google Patents

一种检测方法及装置 Download PDF

Info

Publication number
CN105677559B
CN105677559B CN201511027958.0A CN201511027958A CN105677559B CN 105677559 B CN105677559 B CN 105677559B CN 201511027958 A CN201511027958 A CN 201511027958A CN 105677559 B CN105677559 B CN 105677559B
Authority
CN
China
Prior art keywords
code
variable
local variable
value
configuration information
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.)
Expired - Fee Related
Application number
CN201511027958.0A
Other languages
English (en)
Other versions
CN105677559A (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.)
Hangzhou Huawei Digital Technologies Co Ltd
Original Assignee
Hangzhou Huawei Digital Technologies 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 Hangzhou Huawei Digital Technologies Co Ltd filed Critical Hangzhou Huawei Digital Technologies Co Ltd
Priority to CN201511027958.0A priority Critical patent/CN105677559B/zh
Publication of CN105677559A publication Critical patent/CN105677559A/zh
Application granted granted Critical
Publication of CN105677559B publication Critical patent/CN105677559B/zh
Expired - Fee Related 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/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • 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/3644Software debugging by instrumenting at runtime

Abstract

本发明公开了一种检测方法及装置,用以解决现有技术的代码检测工具无法识别一些复杂场景中的局部变量未初始化,降低了检测效率的问题,该方法包括:根据第一变量配置信息对一测试代码中的第一设定局部变量赋值,并基于所述测试代码中的第一设定局部变量的取值状态,对赋值后的第一设定局部变量进行覆盖,生成第一待编译代码,最终生成第一运行结果,同时,根据第二变量配置信息,对所述测试代码进行上述同样的处理,生成第二待编译代码,最终生成第二运行结果,在第一运行结果和第二运行结果不同时,确定所述测试代码中存在局部变量未初始化,这样,检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率。

Description

一种检测方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种检测方法及装置。
背景技术
在程序代码中,时常会出现程序代码中使用的局部变量未初始化的问题,这些问题可能会导致该程序代码无法运行,或者存在潜在的缺陷。为了避免这些问题,传统地,业界通常需要代码检测工具(例如PCLint、Coverity等)对程序代码进行分析检测。
然而,现有的代码检测工具无法识别一些复杂场景中的局部变量未初始化,例如,对于一些结构体等聚合数据类型的程序代码,一部分局部变量已经初始化,而另一部分局部变量未初始化的场景。这样,传统的代码检测工具无法检测出程序代码中所有未初始化的局部变量,降低了检测效率。
发明内容
本发明提供一种检测方法及装置,用以解决现有技术中的代码检测工具无法识别一些复杂场景中的局部变量未初始化,降低了检测效率的问题。
本发明提供的具体技术方案如下:
第一方面,提供了一种检测方法,包括:
根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题。
结合第一方面,在第一方面的第一种可能的实现方式中,根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,包括:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,包括:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖。
结合第一方面、第一方面的第一种和第二种可能的实现方式中的任一项,在第一方面的第三种可能的实现方式中,确定所述测试代码中存在局部变量未初始化,包括:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
这样,检测装置通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位,提高了对未初始化局部变量定位的效率。
结合第一方面、第一方面的第一种至第三种可能的实现方式中的任一项,在第一方面的第四种可能的实现方式中,所述第一变量配置信息是通过包含所述第一变量配置信息的配置文件获得的;所述第二变量配置信息是通过包含所述第二变量配置信息的配置文件获得的。
第二方面,提供了一种检测装置,所述检测装置具有实现上述检测方法中的检测装置行为的功能,可以通过硬件执行相应的软件实现,所述软件包括一个或多个与上述功能相对应的模块。所述检测装置包括:赋值单元、处理单元,以及确定单元,其中,
赋值单元,用于根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
处理单元,用于基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
所述赋值单元,还用于根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
所述处理单元,还用于基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
确定单元,用于当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
第三方面,提供了一种检测设备,所述检测设备具有实现上述检测方法中的检测装置行为的功能,可以通过硬件实现,所述硬件包括一个或多个与上述功能相对应的模块,所述检测设备包括:收发器、处理器、总线,以及存储器,收发器、处理器以及存储器通过总线相互连接,其中,
收发器用于与其它设备通信;
处理器用于实现检测方法,包括:
根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化;
存储器,用于存放程序,所述处理器执行所述存储器所存放的程序。
采用本发明提供的检测方法,检测装置对一测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;并基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,对所述测试代码中的第二设定局部变量进行赋值,生成第二初始化代码,在通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题。
附图说明
图1为本发明实施例提供的一种检测方法的流程图;
图2为本发明实施例提供的一种检测装置的结构示意图;
图3为本发明实施例提供的一种检测设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明实施例提供一种检测方法及装置,用以解决传统的代码检测工具无法识别一些复杂场景中的局部变量未初始化,检测效率较低的问题。其中,本发明所述方法和控制器基于同一发明构思,由于方法及装置解决问题的原理相似,因此装置与方法的实施可以相互参见,重复之处不再赘述。
本发明实施例中,针对一测试代码,根据包含为至少一个第一设定局部变量配置的取值的第一变量配置信息,对所述测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,根据包含为至少一个第二设定局部变量配置的取值的第二变量配置信息,以及原始的所述测试代码,通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,采用本发明实施例提供的方法,无论在任何场景中(例如结构体等聚合数据类型的程序代码),均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率。
本发明实施例提供的检测方法,适用于对各种编程语言(例如C语言、C++、Java等)定义的程序代码,参阅图1所示,本发明实施例提供的一种检测方法,应用于对程序代码进行检测的检测装置,所述检测装置可以为编译器。该方法的处理流程包括:
步骤101:根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值。
可选的,在步骤101中,所述第一变量配置信息可以是通过包含所述第一变量配置信息的配置文件获得的,即设置一个独立的配置文件,在配置文件设置所述测试代码中第一设定局部变量的取值,后期检测装置可以根据第一变量配置信息对所述测试代码中的第一设定局部变量进行赋值,生成第一初始化。
可选的,根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,包括:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
传统的,所述检测装置可以根据应用程序二进制接口(Application BinaryInterface,ABI)对所述测试代码进行解析,并在所述测试代码的栈中确定所述测试代码中的每个局部变量的栈区间(包括起始位置以及大小),由于确定了每个局部变量的栈区间,显然,所述检测装置确定了每个第一设定局部变量的栈区间;然后,所述检测装置可以根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
可选的,在执行步骤101时,还可以根据第一变量配置信息直接对所述测试代码中的第一设定局部变量进行修改,生成第一初始化代码。
步骤102:基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果。
所述测试代码中的任意一个局部变量均可以是以下任意一种取值状态——已初始化和未初始化,其中,若一个局部变量的取值状态为已初始化,则该局部变量有取值;若该局部变量的取值状态为未初始化,则该局部变量的取值是不确定的,随机的。
可选的,基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,包括:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖;
当所述测试代码中该第一设定局部变量的取值状态为未初始化时,则不对所述栈中该第一设定局部变量的栈区间进行覆盖。
所述检测装置在实施上述步骤,基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖时,可以直接基于所述测试代码中的所有局部变量的取值状态,对所述第一初始化代码中的所有局部变量的取值进行覆盖。
可选的,基于所述第一待编译代码生成第一运行结果,包括:
对所述第一待编译代码进行汇编、链接,生成可执行文件,最终运行该可执行文件,生成第一运行结果。
步骤103:根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值。
步骤104:基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果。
所述步骤103和步骤101采用的方法相同,步骤104和步骤102采用的方法也相同,此处不再赘述。步骤103、步骤104和步骤101、步骤102的执行顺序不分先后。
步骤105:当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
在所述测试代码中所有的局部变量均已初始化的情况下,在步骤101后,生成的第一初始化代码中的第一设定局部变量被重新赋值,然而在步骤102的过程中,第一设定局部变量的取值已经被原始的测试代码中的取值覆盖,因此第一待编译代码和原始的测试代码中每个局部变量的取值是一致的。同理,原始的测试代码经过步骤103和步骤104生成的第二待编译代码和原始的测试代码中每个局部变量的取值是一致的。进一步的,基于第一待编译代码生成的第一运行结果和基于第二待编译代码生成的第二运行结果肯定是相同的。其中,测试代码中影响运行结果的局部变量是编译运行过程中使用的局部变量。
在所述测试代码中的所有的局部变量仅有未初始化的局部变量(局部变量A)的情况下,若第一变量配置信息中不包含为该局部变量A的配置的取值,且第二变量配置信息中也不包含为该局部变量A的配置的取值,则基于第一待编译代码生成的第一运行结果和基于第二待编译代码生成的第二运行结果肯定是相同的;
若第一变量配置信息和第二变量配置信息中均包含为该局部变量A配置的取值,且第一变量配置信息中该局部变量A的取值为m,第二变量配置信息中该局部变量A的取值为n,m和n不同,则在步骤101后,生成的第一初始化代码中的第一设定局部变量被重新赋值,然而在步骤102的过程中,第一设定局部变量中其他局部变量的取值已经被原始的测试代码中的取值覆盖,而该局部变量A未被覆盖,取值为m,因此第一待编译代码和原始的测试代码是不同的。同理,原始的测试代码经过步骤103和步骤104生成的第二待编译代码中该局部变量的取值为n,第二待编译代码和原始的测试代码是不同的,且第一待编译代码和第二待编译代码中的该局部变量A的取值也不同,因此,基于第一待编译代码生成的第一运行结果和基于第二待编译代码生成的第二运行结果肯定是不同的;
若第一变量配置信息中包含为该局部变量A配置的取值,而另一项不包含为该局部变量A配置的取值,基于上述理论,则原始的测试代码经过步骤101和步骤102生成的第一待编译代码和原始的测试代码是不同的,而原始的测试代码经过步骤103和步骤104生成的第二待编译代码和原始的测试代码是相同的,显然,第一待编译代码和第二待编译代码是不同的,因此,基于第一待编译代码生成的第一运行结果和基于第二待编译代码生成的第二运行结果肯定是不同的。
基于以上论述可以得出,只要所述第一运行结果与所述第二运行结果不同,说明第一待编译代码和第二待编译代码中存在至少一个取值或取值状态不同的局部变量,也说明在第一变量配置信息和第二变量配置信息中至少一项中包含有为未初始化的局部变量配置的取值,因此,所述检测装置可以确定所述测试代码中存在局部变量未初始化,且该未初始化的局部变量肯定是编译运行过程中使用的局部变量。
可选的,确定所述测试代码中存在局部变量未初始化,包括:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
例如,某测试代码中包含局部变量A、局部变量B和局部变量C。
第一变量配置信息中包含为局部变量A配置的取值1,为局部变量B配置的取值为2,以及为局部变量C配置的取值为3,那么在步骤101后,生成的第一初始化代码,其中,该第一初始化代码中局部变量A等于1,局部变量B等于2,局部变量C等于3;
经过步骤102后,基于所述测试代码中局部变量A、局部变量B和局部变量C的取值状态,对该第一初始化代码中局部变量A,局部变量B和局部变量C的取值进行覆盖,生成第一待编译代码,生成第一运行结果;
第二变量配置信息中包含为局部变量A配置的取值为1,为局部变量B配置的取值2,在步骤103后,生成的第二初始化代码,其中,该第二初始化代码中局部变量A等于1,局部变量B等于2,而局部变量C未改变取值状态;
经过步骤104后,基于所述测试代码中局部变量A、局部变量B和局部变量C的取值状态,对该第二初始化代码中局部变量A和局部变量B的取值进行覆盖,生成第二待编译代码,生成第二运行结果,由于以上论述可知,第一运行结果和第二运行结果不同,局部变量A、局部变量B和局部变量C中存在局部变量未初始化,由于第一变量配置信息中以及在第二变量配置信息中,为局部变量A配置的和局部变量B设置2,因此,无论在原始的所述测试代码中局部变量A和局部变量B中是否包含未初始化的局部变量,在第一待编译代码和第二待编译代码中局部变量A和局部变量B的取值是相同的,因此,第一待编译代码和第二待编译代码中存在至少一个取值或取值状态不同的局部变量,因此,显然,在第一待编译代码和第二待编译代码中,局部变量C的取值或取值状态不同;由于第二变量配置信息中没有为局部变量C配置取值,因此,可以确定在第一待编译代码和第二待编译代码中,局部变量C的取值状态不同,可以确定在原始的所述测试代码中,局部变量C未初始化,而局部变量A和局部变量B中有可能存在局部变量未初始化;可以进一步的对局部变量A和局部变量B进行下一轮检测。
在对测试代码中局部变量A和局部变量B进行检测时,在第一变量配置信息和第二变量配置信息中为局部变量A配置不同的取值,为局部变量B也配置不同的取值,若最终第一运行结果和第二运行结果相同,说明在原始的测试代码中,局部变量A和局部变量B为已初始化的局部变量;若最终第一运行结果和第二运行结果不同,说明在原始的测试代码中,局部变量A和局部变量B中包含未初始化的局部变量,还需要进一步进行判断。
显然,通过本发明实施例提供的检测方法,可以准确的确定测试代码中是否存在局部变量未初始化,另外,通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位。可选的,可以采用二分法或者其他方法调整第一变量配置信息和第二变量配置信息中为测试代码中的局部变量配置取值,以提高定位未初始化的局部变量的效率。
采用本发明上述实施例中的检测方法,检测装置对一测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;并基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,对所述测试代码中的第二设定局部变量进行赋值,生成第二初始化代码,在通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题,进一步的,通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位,提高了对未初始化局部变量定位的效率。
基于以上实施例,本发明还提供了一种检测装置,用于实现图1所示的检测方法中检测装置的功能,参阅图2所示,所述检测装置200包括:赋值单元201、处理单元202,以及确定单元203,其中,
赋值单元201,用于根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
处理单元202,用于基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
所述赋值单元201,还用于根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
所述处理单元202,还用于基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
确定单元203,用于当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
可选的,所述赋值单元201,在根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值时,具体用于:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
可选的,所述处理单元202,在基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖时,具体用于:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖。
可选的,所述确定单元203,具体用于:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
可选的,所述第一变量配置信息是通过包含所述第一变量配置信息的配置文件获得的;所述第二变量配置信息是通过包含所述第二变量配置信息的配置文件获得的。
采用本发明实施例提供的检测装置,所述检测装置对一测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;并基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,对所述测试代码中的第二设定局部变量进行赋值,生成第二初始化代码,在通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题,进一步的,通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位,提高了对未初始化局部变量定位的效率。
需要说明的是,本发明实施例中对单元的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。在本申请的实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
基于以上实施例,本发明还提供了一种检测设备,用于实现如图1所示的检测方法中检测装置,以及如图2所示的检测装置的功能,参阅图3所示,所述检测设备300中包括:收发器301、处理器302、总线303,以及存储器304,其中:
收发器301、处理器302以及存储器304通过总线303相互连接;总线303可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图3中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
收发器301用于与其它设备通信,如从其他与所述检测设备相连的设备中获取测试代码,获取第一变量配置信息以及第二变量配置信息等。
处理器302用于实现检测方法,包括:
根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
可选的,根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,包括:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
可选的,基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,包括:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖。
可选的,确定所述测试代码中存在局部变量未初始化,包括:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
可选的,所述第一变量配置信息是通过包含所述第一变量配置信息的配置文件获得的;所述第二变量配置信息是通过包含所述第二变量配置信息的配置文件获得的。
该检测设备还可以包括存储器304,用于存放程序等。具体地,程序可以包括程序代码,该程序代码包括计算机操作指令。存储器可能包含随机存取存储器(random accessmemory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。处理器302执行存储器所存放的程序,实现上述功能,从而实现如图1所示的检测方法。
采用本发明实施例提供的检测设备,所述检测设备对一测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;并基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,对所述测试代码中的第二设定局部变量进行赋值,生成第二初始化代码,在通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测设备均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题,进一步的,通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位,提高了对未初始化局部变量定位的效率。
综上所述,本发明实施例提供的检测方法及装置,采用本发明实施例提供的检测装置,所述检测装置对一测试代码中的第一设定局部变量进行赋值,生成第一初始化代码;并基于所述测试代码中每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码,基于所述第一待编译代码生成第一运行结果;然后,对所述测试代码中的第二设定局部变量进行赋值,生成第二初始化代码,在通过与上述同样的步骤,最终生成第二待编译代码,并基于所述第二待编译代码生成第二运行结果;当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化的。这样,无论在任何场景中(例如结构体等聚合数据类型的程序代码),检测装置均可以准确判断程序代码是否存在局部变量未初始化的问题,提高了检测效率,方便用户修改,避免了程序代码因存在未初始化的变量无法运行或运行结果错误的问题,进一步的,通过调整第一变量配置信息和第二变量配置信息,可以实现对测试代码中,未初始化的局部变量的准确定位,提高了对未初始化局部变量定位的效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机非易失性存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (10)

1.一种检测方法,其特征在于,包括:
根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
2.如权利要求1所述的方法,其特征在于,根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,包括:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
3.如权利要求2所述的方法,其特征在于,基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,包括:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖。
4.如权利要求1-3任一项所述的方法,其特征在于,确定所述测试代码中存在局部变量未初始化,包括:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
5.如权利要求1-3任一项所述的方法,其特征在于,所述第一变量配置信息是通过包含所述第一变量配置信息的配置文件获得的;所述第二变量配置信息是通过包含所述第二变量配置信息的配置文件获得的。
6.一种检测装置,其特征在于,包括:
赋值单元,用于根据针对一测试代码设置的第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值,生成第一初始化代码,所述第一变量配置信息中包含分别为每个第一设定局部变量配置的取值;
处理单元,用于基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖,生成第一待编译代码;并基于所述第一待编译代码生成第一运行结果;
所述赋值单元,还用于根据针对所述测试代码设置的第二变量配置信息,对所述测试代码中的至少一个第二设定局部变量进行赋值,生成第二初始化代码,所述第二变量配置信息中包含分别为每个第二设定局部变量配置的对应的取值;
所述处理单元,还用于基于所述测试代码中的所述第二设定局部变量的取值状态,对所述第二初始化代码中的所述第二设定局部变量的取值进行覆盖,生成第二待编译代码;并基于所述第二待编译代码生成第二运行结果;
确定单元,用于当所述第一运行结果与所述第二运行结果不同时,确定所述测试代码中存在局部变量未初始化。
7.如权利要求6所述的装置,其特征在于,所述赋值单元,在根据所述第一变量配置信息,对所述测试代码中的至少一个第一设定局部变量进行赋值时,具体用于:
确定在所述测试代码的栈中,所述测试代码中每个第一设定局部变量的栈区间;
根据所述第一变量配置信息中分别为每个第一设定局部变量配置的取值,对每个第一设定局部变量的栈区间进行填充。
8.如权利要求7所述的装置,其特征在于,所述处理单元,在基于所述测试代码中的每个第一设定局部变量的取值状态,对所述第一初始化代码中的每个第一设定局部变量的取值进行覆盖时,具体用于:
当所述测试代码中该第一设定局部变量的取值状态为已初始化时,根据该第一设定局部变量的取值,对已经填充后的所述栈中该第一设定局部变量的栈区间进行覆盖。
9.如权利要求6-8任一项所述的装置,其特征在于,所述确定单元,具体用于:
当所有第二设定局部变量构成的第二集合为所有第一设定局部变量构成的第一集合的真子集,且在所述第二变量配置信息中为每个第二设定局部变量配置的取值与在所述第一变量配置信息中配置的取值相同时,确定在所述测试代码中,所述第二集合在所述第一集合中的补集包含的局部变量未初始化。
10.如权利要求6-8任一项所述的装置,其特征在于,所述第一变量配置信息是通过包含所述第一变量配置信息的配置文件获得的;所述第二变量配置信息是通过包含所述第二变量配置信息的配置文件获得的。
CN201511027958.0A 2015-12-31 2015-12-31 一种检测方法及装置 Expired - Fee Related CN105677559B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201511027958.0A CN105677559B (zh) 2015-12-31 2015-12-31 一种检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201511027958.0A CN105677559B (zh) 2015-12-31 2015-12-31 一种检测方法及装置

Publications (2)

Publication Number Publication Date
CN105677559A CN105677559A (zh) 2016-06-15
CN105677559B true CN105677559B (zh) 2018-05-11

Family

ID=56298256

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201511027958.0A Expired - Fee Related CN105677559B (zh) 2015-12-31 2015-12-31 一种检测方法及装置

Country Status (1)

Country Link
CN (1) CN105677559B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106294170B (zh) * 2016-08-17 2018-10-19 厦门科灿信息技术有限公司 嵌入式控制系统变量初始化的测试方法
CN109902001B (zh) * 2019-02-12 2022-06-07 科华恒盛股份有限公司 对未初始化变量的检测方法及终端设备

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62118448A (ja) * 1985-11-18 1987-05-29 Nec Corp 不定値参照の検出方式
US5615369A (en) * 1994-07-25 1997-03-25 Hewlett-Packard Company Automated detection and correction of uninitialized variables
CN101520737A (zh) * 2008-02-27 2009-09-02 三星电子株式会社 编译方法和使用该编译方法的处理器
CN101566968A (zh) * 2009-05-20 2009-10-28 阿里巴巴集团控股有限公司 一种检查源代码中空指针的方法和计算机系统
US7661092B1 (en) * 2008-12-30 2010-02-09 International Business Machines Corporation Intelligent reuse of local variables during bytecode compilation
CN102446134A (zh) * 2010-10-13 2012-05-09 无锡江南计算技术研究所 一种实现编译器错误的自动定位方法和装置
CN103257919A (zh) * 2012-02-21 2013-08-21 腾讯科技(深圳)有限公司 脚本程序检查方法和装置
CN103294598A (zh) * 2013-05-28 2013-09-11 华为技术有限公司 一种源代码检查方法及装置

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62118448A (ja) * 1985-11-18 1987-05-29 Nec Corp 不定値参照の検出方式
US5615369A (en) * 1994-07-25 1997-03-25 Hewlett-Packard Company Automated detection and correction of uninitialized variables
CN101520737A (zh) * 2008-02-27 2009-09-02 三星电子株式会社 编译方法和使用该编译方法的处理器
US7661092B1 (en) * 2008-12-30 2010-02-09 International Business Machines Corporation Intelligent reuse of local variables during bytecode compilation
CN101566968A (zh) * 2009-05-20 2009-10-28 阿里巴巴集团控股有限公司 一种检查源代码中空指针的方法和计算机系统
CN102446134A (zh) * 2010-10-13 2012-05-09 无锡江南计算技术研究所 一种实现编译器错误的自动定位方法和装置
CN103257919A (zh) * 2012-02-21 2013-08-21 腾讯科技(深圳)有限公司 脚本程序检查方法和装置
CN103294598A (zh) * 2013-05-28 2013-09-11 华为技术有限公司 一种源代码检查方法及装置

Also Published As

Publication number Publication date
CN105677559A (zh) 2016-06-15

Similar Documents

Publication Publication Date Title
JP6307140B2 (ja) セーフティクリティカルソフトウェア自動要求ベーステストケース生成のためのシステムおよび方法
CN103902456B (zh) 测试脚本处理装置、系统及方法
US7895575B2 (en) Apparatus and method for generating test driver
JP5874891B2 (ja) プログラムテスト装置、プログラムテスト方法、およびプログラム
CN106095654A (zh) 性能验证装置、具有性能验证装置的系统以及方法
CN106776338B (zh) 一种测试方法、装置及服务器
US9317405B2 (en) Test double generation
CN109101237A (zh) 代码的加密编译方法及装置
CN109871312B (zh) 一种接口测试方法、装置、设备及可读存储介质
CN106776334A (zh) 基于注释生成测试用例方法及装置
US9058427B2 (en) Iterative generation of symbolic test drivers for object-oriented languages
CN105677559B (zh) 一种检测方法及装置
CN109614325A (zh) 一种确定控件属性的方法及装置、电子设备和存储介质
JP6310527B1 (ja) オブジェクト分析装置、オブジェクト分析方法、及びプログラム
US11921621B2 (en) System and method for improved unit test creation
CN113094252A (zh) 测试用例生成方法、装置、计算机设备及存储介质
US10592703B1 (en) Method and system for processing verification tests for testing a design under test
CN112434478B (zh) 仿真逻辑系统设计的虚拟接口的方法及相关设备
CN110347588A (zh) 软件验证方法、装置、计算机设备和存储介质
CN109783837A (zh) 仿真设备、仿真系统、仿真方法和仿真程序
Hazott et al. Verifying embedded graphics libraries leveraging virtual prototypes and metamorphic testing
CN109144806B (zh) 一种寄存器传输级电路的功能验证方法及装置
CN110968500A (zh) 一种测试用例的执行方法及装置
US9823305B1 (en) Method and system for generating post-silicon validation tests
CN108509773A (zh) 一种源代码加固方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20180511

Termination date: 20181231

CF01 Termination of patent right due to non-payment of annual fee