首页> 中国专利> 标志访问缺陷检查装置、标志访问缺陷检查方法以及标志访问缺陷检查程序

标志访问缺陷检查装置、标志访问缺陷检查方法以及标志访问缺陷检查程序

摘要

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

著录项

  • 公开/公告号CN104937559A

    专利类型发明专利

  • 公开/公告日2015-09-23

    原文格式PDF

  • 申请/专利权人 日产自动车株式会社;

    申请/专利号CN201380071049.X

  • 发明设计人 市川智;

    申请日2013-12-26

  • 分类号

  • 代理机构北京天昊联合知识产权代理有限公司;

  • 代理人何立波

  • 地址 日本神奈川县

  • 入库时间 2023-12-18 11:09:35

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-10-26

    授权

    授权

  • 2015-10-21

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20131226

    实质审查的生效

  • 2015-09-23

    公开

    公开

说明书

技术领域

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

背景技术

当前,已知一种对由编程语言记述的源程序中的控制流、数据 流以不执行该源程序的方式进行分析的静态分析方法(参照专利文献 1)。

专利文献1:日本特开平09-282173号公报

发明内容

根据专利文献1的静态分析方法,能够明确输入与输出的关系 而使程序的构造可视化。但是,无法使用户注意到实现了可视化的程 序构造中的有可能产生缺陷的位置。

本发明就是鉴于上述课题而提出的,其目的在于提供一种能够 使用户注意到程序构造中的、有可能产生缺陷的位置的标志访问缺陷 检查装置、标志访问缺陷检查方法以及标志访问缺陷检查程序。

本发明的一个方式所涉及的标志访问缺陷检查装置,从利用仅 能设定两个值的标志而切换并执行大于或等于两个的不同的处理的 计算机程序中检测出标志,分别确定对标志进行访问的语句、该语句 中的针对标志的处理内容、以及该语句的执行顺序。并且,基于针对 标志的处理内容以及语句的执行顺序,判断无法利用标志而切换并执 行大于或等于两个的不同的处理的可能性的有无,输出其判断结果。

附图说明

图1是表示本发明的实施方式所涉及的标志访问缺陷检查装置 的硬件结构的框图。

图2是表示CPU11的功能结构的框图。

图3是表示由本发明的实施方式所涉及的标志访问缺陷检查装 置执行的信息处理的流程、以及在信息处理过程中生成的中间数据的 数据流图。

图4(a)~(g)是作为读入的源代码D01而示出用C语言记述 的计算机程序的一例的图。

图5是表示通过变量检测处理(S01)检测的变量的一览即“变 量访问一览(D02)”的表。

图6是表示通过标志提取处理(S02)提取的标志的一览即“标 志一览(D03)”的表。

图7(a)~(g)是表示由分支程序块确定部22确定的分支程序 块ID1~ID4的图。

图8是表示通过上述分支程序块确定处理(S03)确定的分支程 序块的一览即“程序块ID一览(D04)”的表。

图9是表示对标志进行访问的语句所属的分支程序块的一览即 “标志访问一览(D05)”的表。

图10是表示针对标志的处理内容的分类结果即“标志判定一览 (D06)”的表。

图11(a)~(d)是表示针对各个分支程序块ID1~ID4确定各 语句的执行顺序而得到的结果即“语句编号分配一览(D07)”的表。

图12是表示标志访问顺序确定处理(S07)的结果即“标志访 问顺序一览(D08)”的表。

图13(a)、(b)是表示根据标志(Flag)的状态而切换并执 行两个处理(处理1及处理2)的正常的计算机程序的事例的流程图。

图14(a)、(b)是表示通过第1缺陷模式判定处理(S08)而 能够检测出的缺陷的事例的流程图。

图15(a)、(b)是表示通过第2缺陷模式判定处理(S09)而 能够检测出的缺陷的事例的流程图。

图16(a)、(b)是表示通过第3缺陷模式判定处理(S 10)而 能够检测出的缺陷的事例的流程图。

图17(a)~(c)是表示根据标志(Flag)的状态而切换并执行 3个处理(处理1、处理2以及处理3)的正常的计算机程序的事例 的流程图。

图18(a)~(c)是表示通过第4缺陷模式判定处理(S 11)而 能够检测出的缺陷的事例的流程图。

图19是表示“第1缺陷模式判定结果(D09)”的表。

图20是表示“第2缺陷模式判定结果(D10)”的表。

图21是表示“第3缺陷模式判定结果(D11)”的表。

图22是表示“第4缺陷模式判定结果(D12)”的表。

图23是表示“判断结果一览(D13)”的一例的表。

图24(a)~(g)是表示基于图23所示的判断结果一览(D13) 对图4(a)~(g)所示的计算机程序进行修正的结果的图。

图25(a)~(g)是表示对标志写入的值出错的计算机程序的一 例的图。

图26是表示将图25(a)~(g)所示的计算机程序作为检查对 象的情况下的“判断结果一览(D13)”的一例的表。

图27(a)~(g)是表示记述对标志进行访问的处理的位置出错 的计算机程序的一例的图。

图28是表示将图27(a)~(g)所示的计算机程序作为检查对 象的情况下的“判断结果一览(D13)”的一例的表。

具体实施方式

参照附图,对本发明的实施方式进行说明。在附图的记载中, 对同一部分标注同一标号并省略说明。

[标志访问缺陷检查装置的硬件结构]

本发明的实施方式所涉及的标志访问缺陷检查装置,例如能够 适用于由搭载于车辆的电子控制装置(ECU)执行的计算机程序的标 志访问缺陷检查处理。尤其是,能够检查利用仅能设定两个值的标志 而切换并执行大于或等于两个的不同的处理的计算机程序中的、标志 的编码错误或编码遗漏的可能性。

参照图1,对本发明的实施方式所涉及的标志访问缺陷检查装置 的硬件结构进行说明。作为标志访问缺陷检查装置的硬件结构,能够 使用通用的计算机。例如,标志访问缺陷检查装置具备:输入输出装 置12,其从存储介质读入成为检查对象的计算机程序(源代码D01); 存储装置14,其暂时存储由输入输出装置12读入的源代码D01、在 分析过程中生成的中间数据;CPU(中央处理装置)11,其执行各种 运算并对源代码D01进行分析;输入装置13,其供用户输入分析所 需的信息使用;以及显示装置15,其对从CPU11输出的检查结果进 行显示。还能够使用输入输出装置12将检查结果写入到存储介质。

另外,标志访问缺陷检查装置还能够作为客户服务器模型而实 现。例如,经由计算机网络将通用的个人计算机(客户端)与服务器 连接。由此,能够经由计算机网络将具备图1所示的CPU11的服务 器与输入输出装置12、输入装置13、存储装置14、或者显示装置15 连接。在该情况下,标志访问缺陷检查装置主要由CPU11(服务器) 构成,输入输出装置12、输入装置13、存储装置14、或者显示装置 15不包含在标志访问缺陷检查装置中。在该情况下,只要取代存储 装置14而在服务器11所具备的内部硬盘暂时存储分析过程中生成的 中间数据即可。

参照图2,对CPU11的功能结构进行说明。在具备CPU11的计 算机安装并执行用于使具备CPU11的计算机作为标志访问缺陷检查 装置起作用的计算机程序(标志访问缺陷检查程序)。由此,CPU11 构成以下所示的各信息处理部。此外,这里,示出由软件实现标志访 问缺陷检查装置的例子,当然也能够准备用于执行以下所示的各信息 处理的专用硬件而构成标志访问缺陷检查装置。

CPU11构成标志检测部21、分支程序块确定部22、访问位置确 定部23、处理内容分类部24、访问顺序确定部25、缺陷可能性判断 部26、以及检查结果输出部27。标志检测部21中包含变量检测部 28和标志提取部29。缺陷可能性判断部26中包含第1缺陷模式判定 部30、第2缺陷模式判定部31、第3缺陷模式判定部32、以及第4 缺陷模式判定部33。

标志检测部21从存储装置14读入源代码D01,从源代码D01 中检测出标志。所谓“标志”是指在源代码D01中被访问的变量中 的、仅能够设定为例如“0”及“1”等的两个值的变量。所谓“在源 代码D01中被访问的变量”,表示在源代码D01中作为写入处理或 读出处理的对象而记述的变量。所谓“变量”是指分配到RAM区域 的局部变量、全局变量、静态(Static)变量等在源代码D01中其值 能够发生变更的符号。具体地说,变量检测部28检测在源代码D01 中被访问的变量。检测出的变量暂时存储于存储部14中。标志提取 部29将存储于存储部14中的变量读出,从由变量检测部28检测的 变量中提取标志。由标志检测部21提取的标志暂时存储于存储部14 中。

分支程序块确定部22从存储装置14读入源代码D01,从源代 码D01所包含的语句中,确定由基于规定的条件语句而分支的一组 语句构成的分支程序块。在“规定的条件语句”中,例如在C语言 的情况下,包含if语句或switch语句。所谓“基于规定的条件语句 而分支的一组语句”,例如在C语言的情况下,是指if语句或switch 语句、以及其后续接的由括号“{”、“}”包围的处理单位。作为能 够判定为条件分支的位置,例如预先规定“if”以及“switch”。分 支程序块确定部22从成为分析对象的源代码D01中,确定能够判定 为条件分支的位置,将其后续接的由“{”和“}”包围的处理单位确 定为分支程序块。由分支程序块确定部22确定的分支程序块暂时存 储于存储部14中。

访问位置确定部23从存储装置14读入源代码D01以及由标志 检测部21提取的标志。并且,访问位置确定部23在源代码D01中 确定对由标志检测部21检测出的标志进行访问的语句。即,访问位 置确定部23确定对标志的访问位置。表示所确定的语句的信息暂时 存储于存储部14中。

处理内容分类部24从存储部14读入表示语句的信息,对由访 问位置确定部23确定的语句中的针对标志的处理内容进行分类。处 理内容分类部24将针对标志的处理内容分类为针对标志的写入处 理、或者针对标志的读出处理。并且,处理内容分类部24将针对标 志的写入处理分类为针对标志写入第1值的处理、或者针对标志写入 与第1值不同的第2值的处理。“第1值”及“第2值”表示例如“0” 及“1”等能够针对标志进行设定的两个值。处理内容的分类结果暂 时存储于存储部14中。

访问顺序确定部25从存储部14读入表示语句的信息,确定由 访问位置确定部23确定的语句的执行顺序。具体而言,访问顺序确 定部25从成为检查对象的源代码D01一行一行地读入语句,确定各 语句的执行顺序。访问顺序确定部25基于由访问位置确定部23确定 的对标志的访问位置(语句)、和各语句的执行顺序,确定对标志进 行访问的语句的执行顺序。所确定的执行顺序暂时存储于存储部14 中。

缺陷可能性判断部26从存储部14读入处理内容的分类结果、 以及所确定的执行顺序。并且,缺陷可能性判断部26基于由处理内 容分类部24分类的针对标志的处理内容、以及由访问顺序确定部25 确定的语句的执行顺序,判断无法利用标志而切换并执行大于或等于 两个的不同的处理的可能性的有无。具体地说,缺陷可能性判断部 26根据第1缺陷模式判定部30、第2缺陷模式判定部31、第3缺陷 模式判定部32、以及第4缺陷模式判定部33中至少一个判定部的判 定结果,判断无法利用标志而切换并执行大于或等于两个的不同的处 理的可能性的有无。

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

第2缺陷模式判定部31判定在执行第1语句或第2语句之后是 否再次执行第1语句或第2语句而不执行第3语句。在第2缺陷模式 判定部31判定为在执行第1语句或第2语句之后再次执行第1语句 或第2语句而不执行第3语句的情况下,缺陷可能性判断部26判断 为存在无法利用标志而切换并执行大于或等于两个的不同的处理的 可能性。

第3缺陷模式判定部32判定在各个分支程序块中是否执行第1 语句以及第2语句这两个语句。在第3缺陷模式判定部32判定为执 行这两个语句的情况下,缺陷可能性判断部26判断为存在无法利用 标志而切换并执行大于或等于两个的不同的处理的可能性。

第4缺陷模式判定部33判定在执行第3语句之后,是否在与第 3语句相同的分支程序块中执行对标志的值进行改写的语句。具体而 言,第4缺陷模式判定部33判定是否在对标志设定了第1值的状态 下执行第2语句、或者是否在对标志设定了第2值的状态下对标志执 行第1语句。在第4缺陷模式判定部33判定为在执行第3语句之后, 在与第3语句相同的分支程序块中未执行对标志的值进行改写的语 句的情况下,缺陷可能性判断部26判断为存在无法利用标志而切换 并执行大于或等于两个的不同的处理的可能性。

检查结果输出部27将缺陷可能性判断部26的判断结果向显示 装置15或者插入于输入输出装置12的存储介质输出。

[由标志访问缺陷检查装置执行的信息处理的次序]

下面,作为本发明的实施方式所涉及的标志访问缺陷检查方法 的一例,参照图3~图24对由图1及图2所示的标志访问缺陷检查装 置执行的信息处理的次序进行说明。

首先,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开始的连续编号 表示各文件的“行号”。

变量检测部28执行图3所示的“变量检测”处理(S01)。在 变量检测处理(S01)中,检测出在源代码D01中被访问的变量,生 成“变量访问一览”(D02)。图5的表是示出通过上述的变量检测 处理(S01)而检测出的变量的一览的“变量访问一览(D02)”的 一例。在图5的表中,将检测出的变量名、变量的种类、文件名、行 号、任务名、语句、R/W、以及变量的值输出。上述项目中的文件名、 行号、任务名、以及语句是表示对变量的访问位置的项目。在R/W 中,“W”表示对变量进行写入,“R”表示进行变量的读出。作为 变量的值,“val”表示对变量设定的值是可变的,“L”表示变量是 局部变量。“变量访问一览”(D02)暂时存储于存储部14中。

标志提取部29执行“标志提取”处理(S02)。在标志提取处 理(S02)中,从存储部14读入“变量访问一览”(D02),从检测 出的变量中,作为标志而提取满足以下(1)~(5)的所有条件的变 量,生成“标志一览”(D03)。

(1)是全局(global)变量或静态(static)变量。

(2)未在算术运算中使用。

(3)是固定值。

(4)至少写入一次。

(5)存在清除为“0”、以及设定为“1”等针对预先规定的两 个值的写入处理,不存在针对除此以外的值的写入处理。

图6的表是示出通过上述的标志提取处理(S02)而提取的标志 的一览的“标志一览(D03)”的一例。在图6的例子中,在图5所 示的变量中,变量“val”以及变量“F1”作为标志而被提取。这样, 通过执行变量检测处理(S01)以及标志提取处理(S02),标志检 测部21能够从源代码D01中检测出标志。“标志一览(D03)”暂 时存储于存储部14中。

另一方面,分支程序块确定部22执行图3所示的“分支程序块 确定”处理(S03)。在分支程序块确定处理(S03)中,从存储部 14读入源代码D01,从源代码D01所包含的语句中,确定由基于if 语句或switch语句而分支的一组语句构成的分支程序块。作为分支 程序块的开始位置,确定“if”以及“switch”。并且,将所确定的 “if”以及“switch”之后续接的由“{”和“}”包围的部位确定为 分支程序块,对所确定的分支程序块依次赋予识别编号(程序块ID)。

图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中。

访问位置确定部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中。

处理内容分类部24执行图3所示的“处理内容分类”处理(S05)。 在处理内容分类处理(S05)中,从存储部14读入“标志访问一览” (D05),对通过标志访问位置确定处理(S04)而确定的语句中的 针对标志的处理内容进行分类。具体而言,将针对标志的处理内容分 类为对标志写入第1值的处理、对标志写入第2值的处理、或者针对 标志的读出处理中的某一处理。作为处理内容分类处理(S05)的结 果,处理内容分类部24生成“标志判定一览”(D06)。图10的表 中示出“标志判定一览(D06)”的一例。图10的表对图9所示的 “标志访问一览(D05)”附加了表示针对标志的处理内容的分类结 果的“设定/清除/比较”的项目。“设定”表示对标志写入“1”的 处理,“清除”表示对标志写入“0”的处理,“比较”表示针对标 志的读出处理。“标志判定一览”(D06)暂时存储于存储部14中。

通过以上说明的源代码D01的分析处理,使得标志在哪个程序 块中被设定为“1”、被清除为“0”、或者被比较的信息实现可视化。

然后,访问顺序确定部25执行图3所示的“语句编号分配”处 理(S06)以及“标志访问顺序确定”处理(S07),由此确定对标 志进行访问的语句的执行顺序。

在“语句编号分配”处理(S06)中,从成为检查对象的源代码 D01一行一行地读入语句,确定各语句的执行顺序。例如,从存储部 14读入成为检查对象的源代码D01,对源代码D01中记述的语句进 行分割。所谓“语句的分割”是指一行一行地读入源代码,作为语句 内容而一行一行地输出。这里,针对每一行源代码的文字分析并不重 要。为了简化说明,作为前提条件,检查对象的源代码D01采用一 行一个步骤的记述方式。所谓“一个步骤”表示一个处理。在条件语 句的情况下,以条件表达式为一个步骤,以赋值表达式为一个步骤。 另外,对于分割后的语句,每当分割出一行就对其分配递增的语句编 号。“语句编号”是用于识别各模块的各语句的固有的值,表示语句 的执行顺序。作为语句编号分配处理(S06)的结果,访问顺序确定 部25生成“语句编号分配一览”(D07)。图11(a)~(d)的表中 示出“语句编号分配一览(D07)”的一例。在图11(a)~(d)的 例子中,针对各个分支程序块ID1~ID4,确定各语句的执行顺序。“语 句编号分配一览(D07)”暂时存储于存储部14中。

在“标志访问顺序确定”处理(S07)中,从存储部14读入“标 志判定一览”(D06)以及“语句编号分配一览”(D07)。并且, 基于通过标志访问位置确定处理(S04)而确定的对标志的访问位置 (语句)、以及通过语句编号分配处理(S06)而确定的各语句的执 行顺序,确定对标志进行访问的语句的执行顺序。例如,利用图11 (a)~(d)所示的语句编号分配一览(D07),对于图10所示的各 语句追加语句编号,对图10所示的各语句按照其执行顺序进行排序。 作为标志访问顺序确定处理(S07)的结果,访问顺序确定部25生 成“标志访问顺序一览”(D08)。图12的表中示出“标志访问顺 序一览(D08)”的一例。在图12的表中,包含对标志进行访问的 语句所属的分支程序块(程序块ID)、对标志进行访问的语句的处 理内容(设定/清除/比较)、以及对标志进行访问的语句的执行顺序 (语句编号)。“标志访问顺序一览”(D08)暂时存储于存储部14 中。

通过以上说明的访问顺序确定部25的分析处理,使得对标志进 行访问的语句的执行顺序进一步实现可视化。

然后,缺陷可能性判断部26从存储部14读入“标志访问顺序 一览”(D08),执行图3所示的“第1缺陷模式判定”(S08)~ “第4缺陷模式判定”处理(S11)。具体而言,第1缺陷模式判定 部30执行“第1缺陷模式判定”处理(S08),第2缺陷模式判定 部31执行“第2缺陷模式判定”处理(S09),第3缺陷模式判定 部32执行“第3缺陷模式判定”处理(S10),第4缺陷模式判定 部33执行“第4缺陷模式判定”处理(S11)。

这里,对通过第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)。

下面,参照图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”的处理、 以及进行比较的处理全部都必须存在于计算机程序中。

因此,在“第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。

下面,参照图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”, 则必须在不被覆盖的情况下进行比较。

因此,在“第2缺陷模式判定”处理(S09)中,判定在执行第 1语句或第2语句之后是否再次执行第1语句或第2语句而不执行第 3语句。作为第2缺陷模式判定处理(S09)的结果,第2缺陷模式 判定部31生成“第2缺陷模式判定结果”(D10)。图20的表中示 出“第2缺陷模式判定结果(D10)”的一例。关于标志“val”,在 根据“Task1”的语句编号2进行写入处理之后,直至根据“Task2” 的语句编号2进行读出处理(比较处理)为止,不存在写入处理。由 此,第2缺陷模式判定结果为OK。关于标志“F1”,在根据“Task3” 的语句编号3进行写入处理之后,直至根据“Task4”的语句编号1 以及“Task3”的语句编号3进行读出处理(比较处理)为止,不存 在写入处理。由此,第2缺陷模式判定结果为OK。“第2缺陷模式 判定结果(D10)”暂时存储于存储部14中。

下面,参照图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”的处理 必须各自处于一项任务中(不能存在于两项任务中)。

因此,在“第3缺陷模式判定”处理(S10)中,判定在各个分 支程序块中是否执行了第1语句以及第2语句这两个语句。作为第3 缺陷模式判定处理(S10)的结果,第3缺陷模式判定部32生成“第 3缺陷模式判定结果”(D11)。图21的表中示出“第3缺陷模式判 定结果(D11)”的一例。关于标志“val”以及“F1”,在各个分支 程序块(ID1~4)中并不执行设定为“1”的处理以及清除为“0”的 处理的双方,因此第3缺陷模式判定结果均为OK。“第3缺陷模式 判定结果(D11)”暂时存储于存储部14中。

下面,对通过第4缺陷模式判定处理(S11)而能够检测出的缺 陷的事例进行说明。首先,参照图17(a)~(c)对正常的计算机程 序的事例进行说明。设想设计者意欲在处理1和处理2或处理3之间 切换并执行处理而设计了计算机程序。在“Task1”的起动时执行了 处理1的情况下,“Flag”随后被清除为“0”,因此在“Task2”或 “Task3”的起动时执行处理2或处理3。这样,以通过在“0”及“1” 之间进行切换来切换并执行处理1和处理2或处理3为目的而使用标 志(Flag)。

下面,参照图18(a)~(c),对通过第4缺陷模式判定处理(S11) 而能够检测出的缺陷的事例进行说明。在执行处理2之后不执行将 “Flag”设定为“1”的处理的情况下,再次执行处理2、处理3而 不执行处理1。在执行处理2之后变得无法执行处理1。根据如下观 点进行检查,能够检测出图18(a)~(c)所示的事例的缺陷,即, 如果利用条件语句对标志进行了比较,则随后在与条件语句相同的分 支程序块中必须执行对标志进行改写的处理。

此外,通过单独评价“Task1”、“Task2”以及“Task3”的测 试(单体测试),无法检测出上述4个事例所涉及的缺陷。另外,即 便使所有“Flag”的构造都实现可视化,也无法检测出该缺陷。通过 综合测试也无法检测出缺陷。另外,不存在利用静态分析工具并以这 种观点而进行验证的工具。

因此,在“第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的语句中记述的比较处理属于分支程序块 ID4。在分支程序块ID4的语句编号3的语句中记述清除为“0”的 处理。另外,在“Task4”的语句编号1的语句中记述的比较处理属 于分支程序块ID5。分支程序块ID5的语句编号3的语句中记述了设 定为“1”的处理。由此,第4缺陷模式判定结果为OK。“第4缺 陷模式判定结果(D12)”暂时存储于存储部14。

如上,缺陷可能性判断部26将第1缺陷模式判定结果(D09)~ 第4缺陷模式判定结果(D12)分别作为缺陷可能性判断部26的判 断结果而输出。

然后,缺陷可能性判断部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缺陷模式判定结果”的含义彼此相同。

检查结果输出部27将在结果综合处理(S12)中生成的“判断 结果一览”(D13)向图1所示的显示装置15或者插入于输入输出 装置12的存储介质输出。

用户通过参照所输出的“判断结果一览”(D13),能够注意到 有可能无法利用标志而切换并执行大于或等于两个的不同的处理的 缺陷的位置。例如,关于标志“val”,程序设计者(用户)根据第1 缺陷模式判定结果(NG)而注意到不存在设定为“1”的处理。另外, 根据第4缺陷模式判定结果(NG),确定为在“Task2”的第4行记 述的比较处理所处的分支程序块ID3中,不存在设定为“1”的处理 或者清除为“0”的处理。关于标志“val”,程序设计者(用户)根 据该确定事项而发现在分支程序块ID3内不存在设定为“1”的处理。

图24(a)~(g)表示基于图23所示的判断结果一览(D13) 对图4(a)~(g)所示的计算机程序进行修正的结果。在图24(b) 所示的文件“Task2.c”的第8行追加有表示将标志“val”设定为“1” 的处理的语句“val=1”,这一点与图4(b)不同。这样,在本实施 方式中,能够确定因特定的标志处理(写入处理)遗漏而有可能产生 的缺陷。

另外,还存在如下事例,即,即使标志处理并未遗漏,对标志 写入的值也出现错误。图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”的处理。因此,程序设计者 (用户)能够注意到,在属于程序块ID3的对标志“val”进行访问 的处理中,在图25(b)的第8行所记述的清除为“0”的处理出错, 设定为“1”的处理是正确的。

另外,即使在标志访问处理未遗漏、且写入的值没有错误的情 况下,也存在标志访问处理的记述位置出错的事例。图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”的处理出错。

[实施方式的效果]

这样,根据实施方式所涉及的标志访问缺陷检查装置,能够使 程序设计者(用户)注意到标志访问处理的遗漏、写入的值的错误、 以及标志访问的记述位置的错误。由此,能够事先防止这些编码错误。

此外,考虑利用单体测试对计算机程序中包含的各个函数 (Task1()、foo()、Task2、calc、output、Task3、Task4)进行检查的 情况。并且,设想如下情况,即,设计了函数“Task2”的程序设计 者在函数“Task2”的详细规格说明书中未注意到在由条件语句 if(val==0)确定的分支程序块中将标志“val”设定为“1”。在该情况 下,单体测试中的输入值和输出值出错,单体测试的结果为OK,无 法确定缺陷。另外,即便利用综合测试对函数“Task2”进行检查, 结果也一样。另外,即使欲由经验丰富者实施复查,在现有技术中也 不存在进行复查的方法。例如,在计算机程序是至今沿用的源代码即 所谓的遗留代码(legacy code)、不存在计算机程序的规格说明书的 情况下,无法确定作为标志而处理的变量。另外,即便假设不是遗留 代码,如果在设计阶段未对作为标志而处理的变量进行管理,则也不 知道哪个变量是标志。即使能够确定标志,也无法使与标志有关的计 算机程序的构造实现可视化,不知道何种构造存在产生缺陷的风险。 根据实施方式所涉及的标志访问缺陷检查装置,能够使用户注意到即 使是单体测试、综合测试或者由经验丰富者进行的复查也难以检测出 的缺陷的位置。

具体地说,如图2所示,标志检测部21从成为检查对象的源代 码D01中检测出标志。访问位置确定部23在源代码D01中确定对由 标志检测部21检测出的标志进行访问的语句。处理内容分类部24 对由访问位置确定部23确定的语句中的针对标志的处理内容进行分 类。访问顺序确定部25确定由访问位置确定部23确定的语句的执行 顺序。缺陷可能性判断部26基于由处理内容分类部24分类的针对标 志的处理内容、以及由访问顺序确定部25确定的语句的执行顺序, 判断无法利用标志而切换并执行大于或等于两个的不同的处理的可 能性的有无。检查结果输出部27将缺陷可能性判断部26的判断结果 输出。利用针对标志的处理内容以及语句的执行顺序,使源代码D01 的构造实现可视化。基于可视化后的源代码D01的构造,能够判断 产生无法利用标志而切换并执行大于或等于两个的不同的处理这一 缺陷的可能性的有无。通过输出该判断结果,能够使用户注意到有可 能产生缺陷的位置。

处理内容分类部24将针对标志的处理内容分类为对标志写入第 1值(例如“0”)的处理、对标志写入与第1值不同的第2值(例 如“1”)的处理、或者读出标志的值的处理中的某一处理。能够使 针对标志的处理内容实现可视化。基于实现了可视化的、针对标志的 处理内容,能够判断产生无法利用标志而切换并执行大于或等于两个 的不同的处理这一缺陷的可能性的有无。

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

缺陷可能性判断部26判定在执行第1语句或第2语句之后是否 再次执行第1语句或第2语句而不执行第3语句。在再次执行第1 语句或第2语句而不执行第3语句的情况下,缺陷可能性判断部26 判断为存在无法利用标志而切换并执行大于或等于两个的不同的处 理的可能性。在再次执行第1语句或第2语句而不执行第3语句的情 况下,能够切换标志的值,但有可能无法切换并执行大于或等于两个 的不同的处理。因此,能够判断为存在无法利用标志而切换并执行大 于或等于两个的不同的处理的可能性。

标志访问缺陷检查装置还具备分支程序块确定部22,该分支程 序块确定部22从源代码D01所包含的语句中,确定由基于规定的条 件语句而分支的一组语句构成的分支程序块。缺陷可能性判断部26 判定在各个分支程序块中,是否执行第1语句以及第2语句这两个语 句。在执行这两个语句的情况下,缺陷可能性判断部26判断为存在 无法利用标志而切换并执行大于或等于两个的不同的处理的可能性。 在一个分支程序块中执行第1及第2语句的双方的情况下,能够对标 志进行切换,但有可能无法切换并执行大于或等于两个的不同的处 理。因此,能够判断为存在无法利用标志而切换并执行大于或等于两 个的不同的处理的可能性。

缺陷可能性判断部26判定在执行第3语句之后,是否在与第3 语句相同的分支程序块中执行对标志的值进行改写的语句。在未执行 对标志的值进行改写的语句的情况下,缺陷可能性判断部26判断为 存在无法利用标志而切换并执行大于或等于两个的不同的处理的可 能性。在执行了第3语句之后,在与第3语句相同的分支程序块中未 执行对标志的值进行改写的语句的情况下,存在标志的值不切换的可 能性。因此,能够判断为存在无法利用标志而切换并执行大于或等于 两个的不同的处理的可能性。

如上所述,对本发明的实施方式进行了记载,但构成本公开的 一部分的记述以及附图不应被理解为用于对本发明进行限定。对于本 领域技术人员而言,根据本公开而实现的各种各样的代替的实施方 式、实施例以及应用技术是显而易见的。

在实施方式(图23)中,示出了将第1~第4缺陷模式判定部 (30~33)的各个判定结果作为缺陷可能性判断部26的判断结果而 输出的例子。除此之外,例如,缺陷可能性判断部26也可以对第1~ 第4缺陷模式判定部(30~33)的判定结果中的大于或等于两个的判 定结果进行组合而生成一个判断结果。通过对大于或等于两个的判定 结果进行组合,能够使无法利用标志而切换并执行大于或等于两个的 不同的处理的可能性实现数值化。由此,在输出关于多个标志的判断 结果的情况下,能够向用户告知作为验证对象的优先级,因此能够提 高由用户进行的验证作业的效率。

这里引用日本特开2013-008354号(申请日:2013年1月21 日)的全部内容。

标号的说明

21 标志检测部

22 分支程序块确定部

23 访问位置确定部

24 处理内容分类部

25 访问顺序确定部

26 缺陷可能性判断部

27 检查结果输出部

30 第1缺陷模式判定部(缺陷可能性判断部)

31 第2缺陷模式判定部(缺陷可能性判断部)

32 第3缺陷模式判定部(缺陷可能性判断部)

33 第4缺陷模式判定部(缺陷可能性判断部)

D01 源代码(计算机程序)

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号