标志访问缺陷检查装置和标志访问缺陷检查方法转让专利

申请号 : CN201380071049.X

文献号 : CN104937559B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 市川智

申请人 : 日产自动车株式会社

摘要 :

标志访问缺陷检查装置从利用仅能设定两个值的标志而切换并执行大于或等于两个的不同的处理的计算机程序中,检测出标志(S01、S02),分别确定对标志进行访问的语句(D05)、语句中的针对标志的处理内容(D06)、以及语句的执行顺序(D08)(S04、S05、S07)。基于针对标志的处理内容(D06)以及语句的执行顺序(D08),判断无法利用标志而切换并执行大于或等于两个的不同的处理的可能性的有无(S08~S11),输出其判断结果(S12)。

权利要求 :

1.一种标志访问缺陷检查装置,其对利用仅能设定两个值的标志而切换并执行大于或等于两个的不同的处理的计算机程序进行检查,该标志访问缺陷检查装置的特征在于,具备:

标志检测部,其从成为检查对象的所述计算机程序中,检测出所述标志;

访问位置确定部,其在所述计算机程序中,确定对由所述标志检测部检测出的所述标志进行访问的语句;

处理内容分类部,其对由所述访问位置确定部确定出的所述语句中的针对所述标志的处理内容进行分类;

访问顺序确定部,其确定由所述访问位置确定部确定出的所述语句的执行顺序;

缺陷可能性判断部,其基于由所述处理内容分类部分类的针对所述标志的处理内容、以及由所述访问顺序确定部确定的所述语句的执行顺序,判断无法利用所述标志而切换并执行大于或等于两个的不同的处理的可能性的有无;以及检查结果输出部,其输出所述缺陷可能性判断部的判断结果。

2.根据权利要求1所述的标志访问缺陷检查装置,其特征在于,

所述处理内容分类部将针对所述标志的处理内容,分类为对所述标志写入第1值的处理、对所述标志写入与所述第1值不同的第2值的处理、或者读出所述标志的值的处理中的某一处理。

3.根据权利要求2所述的标志访问缺陷检查装置,其特征在于,

所述缺陷可能性判断部判定在所述计算机程序中,是否包含记述对所述标志写入第1值的处理的第1语句、记述对所述标志写入所述第2值的处理的第2语句、以及记述读出所述标志的值的处理的第3语句的所有语句,在未包含所述第1~第3语句的所有语句的情况下,判断为存在无法利用所述标志而切换并执行大于或等两个的不同的处理的可能性。

4.根据权利要求2或3所述的标志访问缺陷检查装置,其特征在于,所述缺陷可能性判断部,判定在执行了记述对所述标志写入第1值的处理的第1语句或记述对所述标志写入第2值的处理的第2语句之后,是否再次执行所述第1语句或所述第2语句而不执行记述读出所述标志的值的处理的第3语句,在判定为再次执行所述第1语句或所述第2语句而不执行所述第3语句的情况下,判断为存在无法利用所述标志而切换并执行大于或等于两个的不同的处理的可能性。

5.根据权利要求2或3所述的标志访问缺陷检查装置,其特征在于,还具备分支程序块确定部,该分支程序块确定部从所述计算机程序所包含的语句中,确定由基于规定的条件语句而分支的一组语句构成的分支程序块,所述缺陷可能性判断部判定在各个所述分支程序块中,是否执行记述对所述标志写入第1值的处理的第1语句以及记述对所述标志写入第2值的处理的第2语句这两个语句,在执行所述这两个语句的情况下,判断为存在无法利用所述标志而切换并执行大于或等于两个的不同的处理的可能性。

6.根据权利要求2或3所述的标志访问缺陷检查装置,其特征在于,还具备分支程序块确定部,该分支程序块确定部从所述计算机程序所包含的语句中,确定由基于规定的条件语句而分支的一组语句构成的分支程序块,所述缺陷可能性判断部判定在执行了记述读出所述标志的值的处理的第3语句之后,是否在与所述第3语句相同的分支程序块中执行对所述标志的值进行改写的语句,在未执行对所述标志的值进行改写的语句的情况下,判断为存在无法利用所述标志而切换并执行大于或等于两个的不同的处理的可能性。

7.一种标志访问缺陷检查方法,其对利用仅能设定两个值的标志而切换并执行大于或等于两个的不同的处理的计算机程序进行检查,该标志访问缺陷检查方法的特征在于,包括如下步骤:

从成为检查对象的所述计算机程序中检测出所述标志;

在所述计算机程序中,确定对检测出的所述标志进行访问的语句;

对所确定的所述语句中的针对所述标志的处理内容进行分类;

确定所确定的所述语句的执行顺序;

基于所分类的针对所述标志的处理内容、以及所确定的所述语句的执行顺序,判断无法利用所述标志而切换并执行大于或等于两个的不同的处理的可能性的有无;以及输出所述判断的结果。

说明书 :

标志访问缺陷检查装置和标志访问缺陷检查方法

技术领域

[0001] 本发明涉及一种标志访问缺陷检查装置、标志访问缺陷检查方法以及标志访问缺陷检查程序。

背景技术

[0002] 当前,已知一种对由编程语言记述的源程序中的控制流、数据流以不执行该源程序的方式进行分析的静态分析方法(参照专利文献1)。
[0003] 专利文献1:日本特开平09-282173号公报

发明内容

[0004] 根据专利文献1的静态分析方法,能够明确输入与输出的关系而使程序的构造可视化。但是,无法使用户注意到实现了可视化的程序构造中的有可能产生缺陷的位置。
[0005] 本发明就是鉴于上述课题而提出的,其目的在于提供一种能够使用户注意到程序构造中的、有可能产生缺陷的位置的标志访问缺陷检查装置、标志访问缺陷检查方法以及标志访问缺陷检查程序。
[0006] 本发明的一个方式所涉及的标志访问缺陷检查装置,从利用仅能设定两个值的标志而切换并执行大于或等于两个的不同的处理的计算机程序中检测出标志,分别确定对标志进行访问的语句、该语句中的针对标志的处理内容、以及该语句的执行顺序。并且,基于针对标志的处理内容以及语句的执行顺序,判断无法利用标志而切换并执行大于或等于两个的不同的处理的可能性的有无,输出其判断结果。

附图说明

[0007] 图1是表示本发明的实施方式所涉及的标志访问缺陷检查装置的硬件结构的框图。
[0008] 图2是表示CPU11的功能结构的框图。
[0009] 图3是表示由本发明的实施方式所涉及的标志访问缺陷检查装置执行的信息处理的流程、以及在信息处理过程中生成的中间数据的数据流图。
[0010] 图4(a)~(g)是作为读入的源代码D01而示出用C语言记述的计算机程序的一例的图。
[0011] 图5是表示通过变量检测处理(S01)检测的变量的一览即“变量访问一览(D02)”的表。
[0012] 图6是表示通过标志提取处理(S02)提取的标志的一览即“标志一览(D03)”的表。
[0013] 图7(a)~(g)是表示由分支程序块确定部22确定的分支程序块ID1~ID4的图。
[0014] 图8是表示通过上述分支程序块确定处理(S03)确定的分支程序块的一览即“程序块ID一览(D04)”的表。
[0015] 图9是表示对标志进行访问的语句所属的分支程序块的一览即“标志访问一览(D05)”的表。
[0016] 图10是表示针对标志的处理内容的分类结果即“标志判定一览(D06)”的表。
[0017] 图11(a)~(d)是表示针对各个分支程序块ID1~ID4确定各语句的执行顺序而得到的结果即“语句编号分配一览(D07)”的表。
[0018] 图12是表示标志访问顺序确定处理(S07)的结果即“标志访问顺序一览(D08)”的表。
[0019] 图13(a)、(b)是表示根据标志(Flag)的状态而切换并执行两个处理(处理1及处理2)的正常的计算机程序的事例的流程图。
[0020] 图14(a)、(b)是表示通过第1缺陷模式判定处理(S08)而能够检测出的缺陷的事例的流程图。
[0021] 图15(a)、(b)是表示通过第2缺陷模式判定处理(S09)而 能够检测出的缺陷的事例的流程图。
[0022] 图16(a)、(b)是表示通过第3缺陷模式判定处理(S 10)而能够检测出的缺陷的事例的流程图。
[0023] 图17(a)~(c)是表示根据标志(Flag)的状态而切换并执行3个处理(处理1、处理2以及处理3)的正常的计算机程序的事例的流程图。
[0024] 图18(a)~(c)是表示通过第4缺陷模式判定处理(S 11)而能够检测出的缺陷的事例的流程图。
[0025] 图19是表示“第1缺陷模式判定结果(D09)”的表。
[0026] 图20是表示“第2缺陷模式判定结果(D10)”的表。
[0027] 图21是表示“第3缺陷模式判定结果(D11)”的表。
[0028] 图22是表示“第4缺陷模式判定结果(D12)”的表。
[0029] 图23是表示“判断结果一览(D13)”的一例的表。
[0030] 图24(a)~(g)是表示基于图23所示的判断结果一览(D13)对图4(a)~(g)所示的计算机程序进行修正的结果的图。
[0031] 图25(a)~(g)是表示对标志写入的值出错的计算机程序的一例的图。
[0032] 图26是表示将图25(a)~(g)所示的计算机程序作为检查对象的情况下的“判断结果一览(D13)”的一例的表。
[0033] 图27(a)~(g)是表示记述对标志进行访问的处理的位置出错的计算机程序的一例的图。
[0034] 图28是表示将图27(a)~(g)所示的计算机程序作为检查对象的情况下的“判断结果一览(D13)”的一例的表。

具体实施方式

[0035] 参照附图,对本发明的实施方式进行说明。在附图的记载中,对同一部分标注同一标号并省略说明。
[0036] [标志访问缺陷检查装置的硬件结构]
[0037] 本发明的实施方式所涉及的标志访问缺陷检查装置,例如能够适用于由搭载于车辆的电子控制装置(ECU)执行的计算机程序的标 志访问缺陷检查处理。尤其是,能够检查利用仅能设定两个值的标志而切换并执行大于或等于两个的不同的处理的计算机程序中的、标志的编码错误或编码遗漏的可能性。
[0038] 参照图1,对本发明的实施方式所涉及的标志访问缺陷检查装置的硬件结构进行说明。作为标志访问缺陷检查装置的硬件结构,能够使用通用的计算机。例如,标志访问缺陷检查装置具备:输入输出装置12,其从存储介质读入成为检查对象的计算机程序(源代码D01);存储单元14,其暂时存储由输入输出装置12读入的源代码D01、在分析过程中生成的中间数据;CPU(中央处理装置)11,其执行各种运算并对源代码D01进行分析;输入装置13,其供用户输入分析所需的信息使用;以及显示装置15,其对从CPU11输出的检查结果进行显示。还能够使用输入输出装置12将检查结果写入到存储介质。
[0039] 另外,标志访问缺陷检查装置还能够作为客户服务器模型而实现。例如,经由计算机网络将通用的个人计算机(客户端)与服务器连接。由此,能够经由计算机网络将具备图1所示的CPU11的服务器与输入输出装置12、输入装置13、存储单元14、或者显示装置15连接。在该情况下,标志访问缺陷检查装置主要由CPU11(服务器)构成,输入输出装置12、输入装置13、存储单元14、或者显示装置15不包含在标志访问缺陷检查装置中。在该情况下,只要取代存储单元14而在服务器11所具备的内部硬盘暂时存储分析过程中生成的中间数据即可。
[0040] 参照图2,对CPU11的功能结构进行说明。在具备CPU11的计算机安装并执行用于使具备CPU11的计算机作为标志访问缺陷检查装置起作用的计算机程序(标志访问缺陷检查程序)。由此,CPU11构成以下所示的各信息处理部。此外,这里,示出由软件实现标志访问缺陷检查装置的例子,当然也能够准备用于执行以下所示的各信息处理的专用硬件而构成标志访问缺陷检查装置。
[0041] CPU11构成标志检测部21、分支程序块确定部22、访问位置确定部23、处理内容分类部24、访问顺序确定部25、缺陷可能性判断部26、以及检查结果输出部27。标志检测部21中包含变量检测部 28和标志提取部29。缺陷可能性判断部26中包含第1缺陷模式判定部30、第2缺陷模式判定部31、第3缺陷模式判定部32、以及第4缺陷模式判定部33。
[0042] 标志检测部21从存储单元14读入源代码D01,从源代码D01中检测出标志。所谓“标志”是指在源代码D01中被访问的变量中的、仅能够设定为例如“0”及“1”等的两个值的变量。所谓“在源代码D01中被访问的变量”,表示在源代码D01中作为写入处理或读出处理的对象而记述的变量。所谓“变量”是指分配到RAM区域的局部变量、全局变量、静态(Static)变量等在源代码D01中其值能够发生变更的符号。具体地说,变量检测部28检测在源代码D01中被访问的变量。检测出的变量暂时存储于存储部14中。标志提取部29将存储于存储部14中的变量读出,从由变量检测部28检测的变量中提取标志。由标志检测部21提取的标志暂时存储于存储部14中。
[0043] 分支程序块确定部22从存储单元14读入源代码D01,从源代码D01所包含的语句中,确定由基于规定的条件语句而分支的一组语句构成的分支程序块。在“规定的条件语句”中,例如在C语言的情况下,包含if语句或switch语句。所谓“基于规定的条件语句而分支的一组语句”,例如在C语言的情况下,是指if语句或switch语句、以及其后续接的由括号“{”、“}”包围的处理单位。作为能够判定为条件分支的位置,例如预先规定“if”以及“switch”。分支程序块确定部22从成为分析对象的源代码D01中,确定能够判定为条件分支的位置,将其后续接的由“{”和“}”包围的处理单位确定为分支程序块。由分支程序块确定部22确定的分支程序块暂时存储于存储部14中。
[0044] 访问位置确定部23从存储单元14读入源代码D01以及由标志检测部21提取的标志。并且,访问位置确定部23在源代码D01中确定对由标志检测部21检测出的标志进行访问的语句。即,访问位置确定部23确定对标志的访问位置。表示所确定的语句的信息暂时存储于存储部14中。
[0045] 处理内容分类部24从存储部14读入表示语句的信息,对由访问位置确定部23确定的语句中的针对标志的处理内容进行分类。处理内容分类部24将针对标志的处理内容分类为针对标志的写入处理、或者针对标志的读出处理。并且,处理内容分类部24将针对标志的写入处理分类为针对标志写入第1值的处理、或者针对标志写入与第1值不同的第2值的处理。“第1值”及“第2值”表示例如“0”及“1”等能够针对标志进行设定的两个值。处理内容的分类结果暂时存储于存储部14中。
[0046] 访问顺序确定部25从存储部14读入表示语句的信息,确定由访问位置确定部23确定的语句的执行顺序。具体而言,访问顺序确定部25从成为检查对象的源代码D01一行一行地读入语句,确定各语句的执行顺序。访问顺序确定部25基于由访问位置确定部23确定的对标志的访问位置(语句)、和各语句的执行顺序,确定对标志进行访问的语句的执行顺序。所确定的执行顺序暂时存储于存储部14中。
[0047] 缺陷可能性判断部26从存储部14读入处理内容的分类结果、以及所确定的执行顺序。并且,缺陷可能性判断部26基于由处理内容分类部24分类的针对标志的处理内容、以及由访问顺序确定部25确定的语句的执行顺序,判断无法利用标志而切换并执行大于或等于两个的不同的处理的可能性的有无。具体地说,缺陷可能性判断部26根据第1缺陷模式判定部30、第2缺陷模式判定部31、第3缺陷模式判定部32、以及第4缺陷模式判定部33中至少一个判定部的判定结果,判断无法利用标志而切换并执行大于或等于两个的不同的处理的可能性的有无。
[0048] 第1缺陷模式判定部30判定源代码D01中是否包含记述对标志写入第1值的处理的第1语句、记述对标志写入第2值的处理的第2语句、以及记述读出标志的值的处理的第3语句的所有语句。在第1缺陷模式判定部30判断为源代码D01中不包含第1~第3语句的所有语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0049] 第2缺陷模式判定部31判定在执行第1语句或第2语句之后是否再次执行第1语句或第2语句而不执行第3语句。在第2缺陷模式判定部31判定为在执行第1语句或第2语句之后再次执行第1语句或第2语句而不执行第3语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0050] 第3缺陷模式判定部32判定在各个分支程序块中是否执行第1语句以及第2语句这两个语句。在第3缺陷模式判定部32判定为执行这两个语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0051] 第4缺陷模式判定部33判定在执行第3语句之后,是否在与第3语句相同的分支程序块中执行对标志的值进行改写的语句。具体而言,第4缺陷模式判定部33判定是否在对标志设定了第1值的状态下执行第2语句、或者是否在对标志设定了第2值的状态下对标志执行第1语句。在第4缺陷模式判定部33判定为在执行第3语句之后,在与第3语句相同的分支程序块中未执行对标志的值进行改写的语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0052] 检查结果输出部27将缺陷可能性判断部26的判断结果向显示装置15或者插入于输入输出装置12的存储介质输出。
[0053] [由标志访问缺陷检查装置执行的信息处理的次序]
[0054] 下面,作为本发明的实施方式所涉及的标志访问缺陷检查方法的一例,参照图3~图24对由图1及图2所示的标志访问缺陷检查装置执行的信息处理的次序进行说明。
[0055] 首先,CPU11从输入输出装置12读入成为检查对象的源代码D01。此外,可以预先由用户利用输入输出装置12将源代码D01读入到标志访问缺陷检查装置内,并将其存储于存储单元14中。作为读入的源代码D01,图4(a)~(g)示出用C语言记述的计算机程序的一例。成为检查对象的计算机程序记述于图4(a)~(g)所示的7个文件中。图4(a)的文件名是“Task1.c”,图4(b)的文件 名是“Task2.c”,图4(c)的文件名是“Task3.c”,图4(d)的文件名是“Task4.c”,图4(e)的文件名是“foo.c”,图4(f)的文件名是“calc.c”,图4(g)的文件名是“output.c”。在用C语言记述的程序的一例中,在各文件的左端部记载的从1开始的连续编号表示各文件的“行号”。
[0056] 变量检测部28执行图3所示的“变量检测”处理(S01)。在变量检测处理(S01)中,检测出在源代码D01中被访问的变量,生成“变量访问一览”(D02)。图5的表是示出通过上述的变量检测处理(S01)而检测出的变量的一览的“变量访问一览(D02)”的一例。在图5的表中,将检测出的变量名、变量的种类、文件名、行号、任务名、语句、R/W、以及变量的值输出。上述项目中的文件名、行号、任务名、以及语句是表示对变量的访问位置的项目。在R/W中,“W”表示对变量进行写入,“R”表示进行变量的读出。作为变量的值,“val”表示对变量设定的值是可变的,“L”表示变量是局部变量。“变量访问一览”(D02)暂时存储于存储部14中。
[0057] 标志提取部29执行“标志提取”处理(S02)。在标志提取处理(S02)中,从存储部14读入“变量访问一览”(D02),从检测出的变量中,作为标志而提取满足以下(1)~(5)的所有条件的变量,生成“标志一览”(D03)。
[0058] (1)是全局(global)变量或静态(static)变量。
[0059] (2)未在算术运算中使用。
[0060] (3)是固定值。
[0061] (4)至少写入一次。
[0062] (5)存在清除为“0”、以及设定为“1”等针对预先规定的两个值的写入处理,不存在针对除此以外的值的写入处理。
[0063] 图6的表是示出通过上述的标志提取处理(S02)而提取的标志的一览的“标志一览(D03)”的一例。在图6的例子中,在图5所示的变量中,变量“val”以及变量“F1”作为标志而被提取。这样,通过执行变量检测处理(S01)以及标志提取处理(S02),标志检测部21能够从源代码D01中检测出标志。“标志一览(D03)”暂 时存储于存储部14中。
[0064] 另一方面,分支程序块确定部22执行图3所示的“分支程序块确定”处理(S03)。在分支程序块确定处理(S03)中,从存储部14读入源代码D01,从源代码D01所包含的语句中,确定由基于if语句或switch语句而分支的一组语句构成的分支程序块。作为分支程序块的开始位置,确定“if”以及“switch”。并且,将所确定的“if”以及“switch”之后续接的由“{”和“}”包围的部位确定为分支程序块,对所确定的分支程序块依次赋予识别编号(程序块ID)。
[0065] 图7(a)~(g)表示由分支程序块确定部22确定的分支程序块ID1~ID4。在“Task1.c”以及“foo.c”中确定分支程序块ID1,在“Task2.c”、“calc.c”、以及“output.c”中确定分支程序块ID2,在“Task3.c”中确定分支程序块ID3,在“Task4.c”中确定分支程序块ID4。作为分支程序块确定处理(S03)的结果,分支程序块确定部22生成“程序块ID一览”(D04)。图8的表是示出通过上述的分支程序块确定处理(S03)而确定的分支程序块的一览的“程序块ID一览(D04)”的一例。在图8的例子中,对于每个分支程序块,作为程序块开始位置以及程序块结束位置,将文件名以及行号输出。“程序块ID一览”(D04)暂时存储于存储部
14中。
[0066] 访问位置确定部23执行图3所示的“标志访问位置确定”处理(S04)。在标志访问位置确定处理(S04)中,从存储部14读入“标志一览(D03)”以及“程序块ID一览”(D04)。并且,在源代码D01中,确定对由标志提取处理(S02)提取的标志进行访问的语句。例如,确定对图6所示的标志进行访问的语句属于通过分支程序块确定处理(S03)而确定的分支程序块中的哪一个程序块。访问位置确定部23基于图6所示的“标志一览(D03)”和图8所示的“程序块ID一览(D04)”,确定对标志进行访问的语句所属的分支程序块。作为标志访问位置确定处理(S04)的结果,访问位置确定部23生成“标志访问一览”(D05)。图9的表中示出“标志访问一览(D05)”的一例。图9的表对图6所示的“标志一览(D03)”附加了对标志进行访问的语句所属的“程序块ID”的项目。“标志访问一览”(D05) 暂时存储于存储部14中。
[0067] 处理内容分类部24执行图3所示的“处理内容分类”处理(S05)。在处理内容分类处理(S05)中,从存储部14读入“标志访问一览”(D05),对通过标志访问位置确定处理(S04)而确定的语句中的针对标志的处理内容进行分类。具体而言,将针对标志的处理内容分类为对标志写入第1值的处理、对标志写入第2值的处理、或者针对标志的读出处理中的某一处理。作为处理内容分类处理(S05)的结果,处理内容分类部24生成“标志判定一览”(D06)。图10的表中示出“标志判定一览(D06)”的一例。图10的表对图9所示的“标志访问一览(D05)”附加了表示针对标志的处理内容的分类结果的“设定/清除/比较”的项目。“设定”表示对标志写入“1”的处理,“清除”表示对标志写入“0”的处理,“比较”表示针对标志的读出处理。
“标志判定一览”(D06)暂时存储于存储部14中。
[0068] 通过以上说明的源代码D01的分析处理,使得标志在哪个程序块中被设定为“1”、被清除为“0”、或者被比较的信息实现可视化。
[0069] 然后,访问顺序确定部25执行图3所示的“语句编号分配”处理(S06)以及“标志访问顺序确定”处理(S07),由此确定对标志进行访问的语句的执行顺序。
[0070] 在“语句编号分配”处理(S06)中,从成为检查对象的源代码D01一行一行地读入语句,确定各语句的执行顺序。例如,从存储部14读入成为检查对象的源代码D01,对源代码D01中记述的语句进行分割。所谓“语句的分割”是指一行一行地读入源代码,作为语句内容而一行一行地输出。这里,针对每一行源代码的文字分析并不重要。为了简化说明,作为前提条件,检查对象的源代码D01采用一行一个步骤的记述方式。所谓“一个步骤”表示一个处理。在条件语句的情况下,以条件表达式为一个步骤,以赋值表达式为一个步骤。另外,对于分割后的语句,每当分割出一行就对其分配递增的语句编号。“语句编号”是用于识别各模块的各语句的固有的值,表示语句的执行顺序。作为语句编号分配处理(S06)的结果,访问顺序确定部25生成“语句编号分配一览”(D07)。图11(a)~(d)的表中 示出“语句编号分配一览(D07)”的一例。在图11(a)~(d)的例子中,针对各个分支程序块ID1~ID4,确定各语句的执行顺序。“语句编号分配一览(D07)”暂时存储于存储部14中。
[0071] 在“标志访问顺序确定”处理(S07)中,从存储部14读入“标志判定一览”(D06)以及“语句编号分配一览”(D07)。并且,基于通过标志访问位置确定处理(S04)而确定的对标志的访问位置(语句)、以及通过语句编号分配处理(S06)而确定的各语句的执行顺序,确定对标志进行访问的语句的执行顺序。例如,利用图11(a)~(d)所示的语句编号分配一览(D07),对于图10所示的各语句追加语句编号,对图10所示的各语句按照其执行顺序进行排序。作为标志访问顺序确定处理(S07)的结果,访问顺序确定部25生成“标志访问顺序一览”(D08)。图12的表中示出“标志访问顺序一览(D08)”的一例。在图12的表中,包含对标志进行访问的语句所属的分支程序块(程序块ID)、对标志进行访问的语句的处理内容(设定/清除/比较)、以及对标志进行访问的语句的执行顺序(语句编号)。“标志访问顺序一览”(D08)暂时存储于存储部14中。
[0072] 通过以上说明的访问顺序确定部25的分析处理,使得对标志进行访问的语句的执行顺序进一步实现可视化。
[0073] 然后,缺陷可能性判断部26从存储部14读入“标志访问顺序一览”(D08),执行图3所示的“第1缺陷模式判定”(S08)~“第4缺陷模式判定”处理(S11)。具体而言,第1缺陷模式判定部30执行“第1缺陷模式判定”处理(S08),第2缺陷模式判定部31执行“第2缺陷模式判定”处理(S09),第3缺陷模式判定部32执行“第3缺陷模式判定”处理(S10),第4缺陷模式判定部33执行“第4缺陷模式判定”处理(S11)。
[0074] 这里,对通过第1缺陷模式判定处理(S08)而能够检测出的缺陷的事例进行说明。首先,参照图13(a)、(b)对正常的计算机程序的事例进行说明。设想根据取值仅能为“1”及“0”的标志(Flag)的状态而切换并执行两个处理(处理1及处理2)的计算机程序。在 “Flag”在图13(a)所示的“Task1”的起动时被设定为“1”的情况下,该计算机程序执行处理1,将“Flag”清除为“0”。接下来,在某个定时起动图13(b)所示的“Task2”时,“Flag”被清除为“0”,因此执行处理2,将“Flag”再次设定为“1”。接下来,在起动“Task1”时,“Flag”被设定为“1”,因此执行处理1,将“Flag”再次清除为“0”。这样,以通过在“0”及“1”之间进行切换来切换并执行处理1及处理2为目的而使用标志(Flag)。
[0075] 下面,参照图14(a)、(b),对通过第1缺陷模式判定处理(S08)而能够检测出的缺陷的事例进行说明。在本事例中,有可能产生处理1和处理2不切换的缺陷。设想设计者意欲切换并执行处理1和处理2而安装了计算机程序。在“Flag”在“Task1”的起动时被设定为“1”的情况下,执行处理1,将“Flag”清除为“0”。如果在该状态下起动“Task2”,则“Flag”被清除为“0”,因此执行处理2。但是,“Flag”保持为“0”,因此即使随后起动“Task1”也不会执行处理1。即,处理1和处理2并不切换。根据如下观点进行检查,能够检测出图14(a)、(b)所示的事例的缺陷,即,作为针对“Flag”的处理内容,设定为“1”的处理、清除为“0”的处理、以及进行比较的处理全部都必须存在于计算机程序中。
[0076] 因此,在“第1缺陷模式判定”处理(S08)中,判定源代码D01中是否包含第1语句、第2语句、以及第3语句的所有语句。作为第1缺陷模式判定处理(S08)的结果,第1缺陷模式判定部30生成“第1缺陷模式判定结果”(D09)。图19的表中示出“第1缺陷模式判定结果(D09)”的一例。关于标志“val”,存在清除为“0”的处理以及进行比较(读出)的处理,但不存在设定为“1”的处理。因此,第1缺陷模式判定结果为NG。即,判定为源代码D01中未包含第1语句、第
2语句、以及第3语句的所有语句。另外,关于标志“F1”,存在清除为“0”的处理、设定为“1”的处理、以及进行比较的处理的所有处理。由此,第1缺陷模式判定结果为OK。“第1缺陷模式判定结果(D09)”暂时存储于存储部14。
[0077] 下面,参照图15(a)、(b),对通过第2缺陷模式判定处理 (S09)而能够检测出的缺陷的事例进行说明。在本事例中,有可能产生处理1和处理2不切换的缺陷。设想设计者意欲交替地执行处理1和处理2而安装了计算机程序。在“Task1”的起动时执行处理1,将“Flag”清除为“0”。在该状态下起动“Task2”的情况下,本应执行处理2,但在处理2之前记述有将“Flag”设定为1的处理。因此,不执行处理2。由此,执行处理1,但不执行处理2。即,处理1和处理2不切换。根据如下观点进行检查,能够检测出图15(a)、(b)所示的事例的缺陷,即,如果标志被设定为“1”或者清除为“0”,则必须在不被覆盖的情况下进行比较。
[0078] 因此,在“第2缺陷模式判定”处理(S09)中,判定在执行第1语句或第2语句之后是否再次执行第1语句或第2语句而不执行第3语句。作为第2缺陷模式判定处理(S09)的结果,第2缺陷模式判定部31生成“第2缺陷模式判定结果”(D10)。图20的表中示出“第2缺陷模式判定结果(D10)”的一例。关于标志“val”,在根据“Task1”的语句编号2进行写入处理之后,直至根据“Task2”的语句编号1进行读出处理(比较处理)为止,不存在写入处理。由此,第2缺陷模式判定结果为OK。关于标志“F1”,在根据“Task3”的语句编号3进行写入处理之后,直至根据“Task4”的语句编号1以及“Task3”的语句编号1进行读出处理(比较处理)为止,不存在写入处理。由此,第2缺陷模式判定结果为OK。“第2缺陷模式判定结果(D10)”暂时存储于存储部14中。
[0079] 下面,参照图16(a)、(b),对通过第3缺陷模式判定处理(S10)而能够检测出的缺陷的事例进行说明。在本事例中,有可能产生处理1和处理2不切换的缺陷。设想设计者意欲交替地执行处理1和处理2而安装了计算机程序。在“Task1”的起动时执行处理1,将“Flag”清除为“0”。在该状态下起动“Task2”的情况下,执行处理2。在处理2之后,“Flag”被设定为“1”,然后再次被清除为“0”。由此,执行处理2,但不执行处理1。即,处理1和处理2不切换。根据如下观点进行检查,能够检测出图16(a)、(b)所示的事例的缺陷,即,设定为“1”的处理、以及清除为“0”的处理 必须各自处于一项任务中(不能存在于两项任务中)。
[0080] 因此,在“第3缺陷模式判定”处理(S10)中,判定在各个分支程序块中是否执行了第1语句以及第2语句这两个语句。作为第3缺陷模式判定处理(S10)的结果,第3缺陷模式判定部32生成“第3缺陷模式判定结果”(D11)。图21的表中示出“第3缺陷模式判定结果(D11)”的一例。关于标志“val”以及“F1”,在各个分支程序块(ID1~4)中并不执行设定为“1”的处理以及清除为“0”的处理的双方,因此第3缺陷模式判定结果均为OK。“第3缺陷模式判定结果(D11)”暂时存储于存储部14中。
[0081] 下面,对通过第4缺陷模式判定处理(S11)而能够检测出的缺陷的事例进行说明。首先,参照图17(a)~(c)对正常的计算机程序的事例进行说明。设想设计者意欲在处理1和处理2或处理3之间切换并执行处理而设计了计算机程序。在“Task1”的起动时执行了处理1的情况下,“Flag”随后被清除为“0”,因此在“Task2”或“Task3”的起动时执行处理2或处理
3。这样,以通过在“0”及“1”之间进行切换来切换并执行处理1和处理2或处理3为目的而使用标志(Flag)。
[0082] 下面,参照图18(a)~(c),对通过第4缺陷模式判定处理(S11)而能够检测出的缺陷的事例进行说明。在执行处理2之后不执行将“Flag”设定为“1”的处理的情况下,再次执行处理2、处理3而不执行处理1。在执行处理2之后变得无法执行处理1。根据如下观点进行检查,能够检测出图18(a)~(c)所示的事例的缺陷,即,如果利用条件语句对标志进行了比较,则随后在与条件语句相同的分支程序块中必须执行对标志进行改写的处理。
[0083] 此外,通过单独评价“Task1”、“Task2”以及“Task3”的测试(单体测试),无法检测出上述4个事例所涉及的缺陷。另外,即便使所有“Flag”的构造都实现可视化,也无法检测出该缺陷。通过综合测试也无法检测出缺陷。另外,不存在利用静态分析工具并以这种观点而进行验证的工具。
[0084] 因此,在“第4缺陷模式判定”处理(S11)中,判定在执行了 第3语句之后是否在与第3语句相同的分支程序块中执行对标志的值进行改写的语句。作为第4缺陷模式判定处理(S11)的结果,第4缺陷模式判定部33生成“第4缺陷模式判定结果”(D12)。图22的表中示出“第4缺陷模式判定结果(D12)”的一例。关于标志“val”,在“Task2”的语句编号1的语句中记述的比较处理属于分支程序块ID3。分支程序块ID3内不存在设定为“1”的处理或者清除为“0”的处理。由此,第4缺陷模式判定结果为NG。另外,关于标志“F1”,在“Task3”的语句编号1的语句中记述的比较处理属于分支程序块ID3。在分支程序块ID3的语句编号3的语句中记述清除为“0”的处理。另外,在“Task4”的语句编号1的语句中记述的比较处理属于分支程序块ID4。分支程序块ID4的语句编号3的语句中记述了设定为“1”的处理。由此,第4缺陷模式判定结果为OK。“第4缺陷模式判定结果(D12)”暂时存储于存储部14。
[0085] 如上,缺陷可能性判断部26将第1缺陷模式判定结果(D09)~第4缺陷模式判定结果(D12)分别作为缺陷可能性判断部26的判断结果而输出。
[0086] 然后,缺陷可能性判断部26执行图3所示的“结果综合”处理(S12)。在结果综合处理(S12)中,从存储部14读入第1缺陷模式判定结果(D09)~第4缺陷模式判定结果(D12),将这些判定结果的综合结果作为缺陷可能性判断部26的判断结果而输出。具体地说,生成对图19~图22所示的第1缺陷模式判定结果(D09)~第4缺陷模式判定结果(D12)进行汇总而得到的“判断结果一览”(D13)。图23的表中示出“判断结果一览(D13)”的一例。图23所示的“第1缺陷”~“第4缺陷”与图19~图22所示的“第1缺陷模式判定结果”~“第4缺陷模式判定结果”的含义彼此相同。
[0087] 检查结果输出部27将在结果综合处理(S12)中生成的“判断结果一览”(D13)向图1所示的显示装置15或者插入于输入输出装置12的存储介质输出。
[0088] 用户通过参照所输出的“判断结果一览”(D13),能够注意到有可能无法利用标志而切换并执行大于或等于两个的不同的处理的 缺陷的位置。例如,关于标志“val”,程序设计者(用户)根据第1缺陷模式判定结果(NG)而注意到不存在设定为“1”的处理。另外,根据第4缺陷模式判定结果(NG),确定为在“Task2”的第4行记述的比较处理所处的分支程序块ID2中,不存在设定为“1”的处理或者清除为“0”的处理。关于标志“val”,程序设计者(用户)根据该确定事项而发现在分支程序块ID2内不存在设定为“1”的处理。
[0089] 图24(a)~(g)表示基于图23所示的判断结果一览(D13)对图4(a)~(g)所示的计算机程序进行修正的结果。在图24(b)所示的文件“Task2.c”的第8行追加有表示将标志“val”设定为“1”的处理的语句“val=1”,这一点与图4(b)不同。这样,在本实施方式中,能够确定因特定的标志处理(写入处理)遗漏而有可能产生的缺陷。
[0090] 另外,还存在如下事例,即,即使标志处理并未遗漏,对标志写入的值也出现错误。图25(a)~(g)表示对标志写入的值出错的计算机程序的一例。图26表示将图25(a)~(g)所示的计算机程序作为检查对象的情况下的“判断结果一览(D13)”的一例。在图25(b)所示的文件“Task2.c”的第8行安装了将标志“val”清除为“0”的处理。在该情况下,不存在将标志“val”设定为“1”的处理,因此第1缺陷模式判定结果为NG。将“val”清除为“0”的处理存在于两项任务中,因此第3缺陷模式判定结果为NG。另外,在分支程序块ID2的比较处理之后,不存在将“val”设定为“1”的处理,因此第4缺陷模式判定结果为NG。用户通过参照图26所示的“判断结果一览”(D13)而注意到,关于标志“val”,不存在设定为“1”的处理,存在多余的清除为“0”的处理。因此,程序设计者(用户)能够注意到,在属于程序块ID2的对标志“val”进行访问的处理中,在图25(b)的第8行所记述的清除为“0”的处理出错,设定为“1”的处理是正确的。
[0091] 另外,即使在标志访问处理未遗漏、且写入的值没有错误的情况下,也存在标志访问处理的记述位置出错的事例。图27(a)~(g)表示记述对标志进行访问的处理的位置出错的计算机程序的一例。图 28表示将图27(a)~(g)所示的计算机程序作为检查对象的情况下的“判断结果一览(D13)”的一例。在图27(b)所示的文件“Task2.c”的第4行记述有将标志“val”设定为“1”的处理。在该情况下,存在设定为“1”的处理,因此第1缺陷模式判定结果、第3缺陷模式判定结果以及第4缺陷模式判定结果全部为OK。但是,在图27(e)所示的文件“foo.c”的第4行执行了将“val”清除为“0”的处理之后,在图27(b)所示的文件“Task2.c”的第4行执行将“val”设定为“1”的处理,而不执行读出“val”的处理。因此,第2缺陷模式判定结果为NG。用户通过参照图28所示的“判断结果一览”(D13)而注意到,在执行了标志“val”的写入处理之后,在执行标志“val”的比较处理之前再次执行了写入处理。因此,程序设计者(用户)注意到,在文件“Task2.c”的第4行将“val”设定为“1”的处理出错。
[0092] [实施方式的效果]
[0093] 这样,根据实施方式所涉及的标志访问缺陷检查装置,能够使程序设计者(用户)注意到标志访问处理的遗漏、写入的值的错误、以及标志访问的记述位置的错误。由此,能够事先防止这些编码错误。
[0094] 此外,考虑利用单体测试对计算机程序中包含的各个函数(Task1()、foo()、Task2、calc、output、Task3、Task4)进行检查的情况。并且,设想如下情况,即,设计了函数“Task2”的程序设计者在函数“Task2”的详细规格说明书中未注意到在由条件语句if(val==0)确定的分支程序块中将标志“val”设定为“1”。在该情况下,单体测试中的输入值和输出值出错,单体测试的结果为OK,无法确定缺陷。另外,即便利用综合测试对函数“Task2”进行检查,结果也一样。另外,即使欲由经验丰富者实施复查,在现有技术中也不存在进行复查的方法。例如,在计算机程序是至今沿用的源代码即所谓的遗留代码(legacy code)、不存在计算机程序的规格说明书的情况下,无法确定作为标志而处理的变量。另外,即便假设不是遗留代码,如果在设计阶段未对作为标志而处理的变量进行管理,则也不知道哪个变量是标志。即使能够确定标志,也无法使与标志有关的计算机程序的构造实现可视化,不知道何种构造存在产生缺陷的风险。 根据实施方式所涉及的标志访问缺陷检查装置,能够使用户注意到即使是单体测试、综合测试或者由经验丰富者进行的复查也难以检测出的缺陷的位置。
[0095] 具体地说,如图2所示,标志检测部21从成为检查对象的源代码D01中检测出标志。访问位置确定部23在源代码D01中确定对由标志检测部21检测出的标志进行访问的语句。
处理内容分类部24对由访问位置确定部23确定的语句中的针对标志的处理内容进行分类。
访问顺序确定部25确定由访问位置确定部23确定的语句的执行顺序。缺陷可能性判断部26基于由处理内容分类部24分类的针对标志的处理内容、以及由访问顺序确定部25确定的语句的执行顺序,判断无法利用标志而切换并执行大于或等于两个的不同的处理的可能性的有无。检查结果输出部27将缺陷可能性判断部26的判断结果输出。利用针对标志的处理内容以及语句的执行顺序,使源代码D01的构造实现可视化。基于可视化后的源代码D01的构造,能够判断产生无法利用标志而切换并执行大于或等于两个的不同的处理这一缺陷的可能性的有无。通过输出该判断结果,能够使用户注意到有可能产生缺陷的位置。
[0096] 处理内容分类部24将针对标志的处理内容分类为对标志写入第1值(例如“0”)的处理、对标志写入与第1值不同的第2值(例如“1”)的处理、或者读出标志的值的处理中的某一处理。能够使针对标志的处理内容实现可视化。基于实现了可视化的、针对标志的处理内容,能够判断产生无法利用标志而切换并执行大于或等于两个的不同的处理这一缺陷的可能性的有无。
[0097] 缺陷可能性判断部26判定源代码D01中是否包含记述对标志写入第1值的处理的第1语句、记述对标志写入第2值的处理的第2语句、以及记述读出标志的值的处理的第3语句的所有语句。在不包含第1~第3语句的所有语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。在不包含第1~第3语句的所有语句的情况下,存在标志的值不切换的可能性。因此,能够判断为存在无法利用标志而切换并执行 大于或等于两个的不同的处理的可能性。
[0098] 缺陷可能性判断部26判定在执行第1语句或第2语句之后是否再次执行第1语句或第2语句而不执行第3语句。在再次执行第1语句或第2语句而不执行第3语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。在再次执行第1语句或第2语句而不执行第3语句的情况下,能够切换标志的值,但有可能无法切换并执行大于或等于两个的不同的处理。因此,能够判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0099] 标志访问缺陷检查装置还具备分支程序块确定部22,该分支程序块确定部22从源代码D01所包含的语句中,确定由基于规定的条件语句而分支的一组语句构成的分支程序块。缺陷可能性判断部26判定在各个分支程序块中,是否执行第1语句以及第2语句这两个语句。在执行这两个语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。在一个分支程序块中执行第1及第2语句的双方的情况下,能够对标志进行切换,但有可能无法切换并执行大于或等于两个的不同的处理。因此,能够判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0100] 缺陷可能性判断部26判定在执行第3语句之后,是否在与第3语句相同的分支程序块中执行对标志的值进行改写的语句。在未执行对标志的值进行改写的语句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。在执行了第3语句之后,在与第3语句相同的分支程序块中未执行对标志的值进行改写的语句的情况下,存在标志的值不切换的可能性。因此,能够判断为存在无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。
[0101] 如上所述,对本发明的实施方式进行了记载,但构成本公开的一部分的记述以及附图不应被理解为用于对本发明进行限定。对于本领域技术人员而言,根据本公开而实现的各种各样的代替的实施方 式、实施例以及应用技术是显而易见的。
[0102] 在实施方式(图23)中,示出了将第1~第4缺陷模式判定部(30~33)的各个判定结果作为缺陷可能性判断部26的判断结果而输出的例子。除此之外,例如,缺陷可能性判断部26也可以对第1~第4缺陷模式判定部(30~33)的判定结果中的大于或等于两个的判定结果进行组合而生成一个判断结果。通过对大于或等于两个的判定结果进行组合,能够使无法利用标志而切换并执行大于或等于两个的不同的处理的可能性实现数值化。由此,在输出关于多个标志的判断结果的情况下,能够向用户告知作为验证对象的优先级,因此能够提高由用户进行的验证作业的效率。
[0103] 这里引用日本特开2013-008354号(申请日:2013年1月21日)的全部内容。
[0104] 标号的说明
[0105] 21 标志检测部
[0106] 22 分支程序块确定部
[0107] 23 访问位置确定部
[0108] 24 处理内容分类部
[0109] 25 访问顺序确定部
[0110] 26 缺陷可能性判断部
[0111] 27 检查结果输出部
[0112] 30 第1缺陷模式判定部(缺陷可能性判断部)
[0113] 31 第2缺陷模式判定部(缺陷可能性判断部)
[0114] 32 第3缺陷模式判定部(缺陷可能性判断部)
[0115] 33 第4缺陷模式判定部(缺陷可能性判断部)
[0116] D01 源代码(计算机程序)