WO2014034330A1 - ソフトウェア検証用プログラムおよびソフトウェア検証システム - Google Patents

ソフトウェア検証用プログラムおよびソフトウェア検証システム Download PDF

Info

Publication number
WO2014034330A1
WO2014034330A1 PCT/JP2013/069967 JP2013069967W WO2014034330A1 WO 2014034330 A1 WO2014034330 A1 WO 2014034330A1 JP 2013069967 W JP2013069967 W JP 2013069967W WO 2014034330 A1 WO2014034330 A1 WO 2014034330A1
Authority
WO
WIPO (PCT)
Prior art keywords
variable
model
external environment
unit
software
Prior art date
Application number
PCT/JP2013/069967
Other languages
English (en)
French (fr)
Inventor
正裕 松原
櫻井 康平
成沢 文雄
久光 山中
守 根本
Original Assignee
日立オートモティブシステムズ株式会社
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 日立オートモティブシステムズ株式会社 filed Critical 日立オートモティブシステムズ株式会社
Priority to EP13833807.4A priority Critical patent/EP2891983A4/en
Publication of WO2014034330A1 publication Critical patent/WO2014034330A1/ja

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

Abstract

 システムの検証モデルとして、ハードウェアなどの外部環境モデルとソフトウェアモデルとを作成して合成する際に、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減するために、変数属性解釈部25は、依存関係解析部22が導出した依存関係情報と、変数属性入力部23と変数属性データベース24のいずれか、または両方が持つ変数属性情報とから、ソースコードに記述された各変数の属性について、可能な限り推論を行う。推論には、推論ルールデータベース26に記録されたルールを用いる。変数属性表示部27は、変数属性解釈部25が推論した変数属性情報を、変数属性入力部23と変数属性データベース24の持つ変数属性情報と併せて、表示装置13に表示する。

Description

ソフトウェア検証用プログラムおよびソフトウェア検証システム
 本発明はソフトウェアの構造を解析するソフトウェアツールに係り、特にデータフローを利用した変数の属性解析と、検証用のモデルを構築するソフトウェアツールに関する。
 近年、ソフトウェアの規模が巨大化し、構造や処理の複雑さが増しており、設計者や検証者がソフトウェアの全容を把握することが困難になっている。また、ソフトウェアが取りうる全ての状態をカバーするテストケースを用意して検証することが難しくなっている。特に車載機器等の制御を行う制御装置では、装置の電動化に伴う制御用ソフトウェアの規模増大により、ソフトウェアを含む電子制御装置に不具合が潜在し、システムの安全性を損なう恐れが増していることを背景として、種々の機能安全規格が制定されている。これらの制御システムでは、ハードウェアの不具合がソフトウェアの不具合を誘発することもあるため、ソフトウェアの検証だけでは不十分であり、ハードウェアとソフトウェアとを合わせて検証する必要がある。しかし特定のタイミングのみに発生する不具合は、テストで検出することが難しい。タイミング関連の不具合を引き起こす要因としては、複数のハードウェアの並行動作や、割り込み処理を挙げることができる。
 システムの安全性を確保する上でも、設計者や検証者がソフトウェア、特に過去のソフトウェア資産や他の設計者が記述したソースコードの構造や処理を理解することが好ましい。また、ソフトウェアの取りうる状態に対するテストの網羅性を向上させ、不具合の原因を排除することが要求される。
 設計者や検証者による理解を容易にすることを目的として、プログラムに対し静的解析や動的解析を行い、その結果を関数コールグラフなどの図形として視覚化する手法とソフトウェアツールがある。視覚化対象のうち、ソフトウェアの構成上で重要な情報の1つとして、命令間や変数間の依存関係がある。ここで依存関係は、実行順序により実行結果が変化する可能性のある関係である。
 一方、システムの状態を網羅的に検証する技術として、モデル検査がある。モデル検査技術では、システムを状態遷移モデルに置き換え、システムに要求される性質をプロパティやアサーションとして定義し、状態遷移モデルと共にツールに入力することで、当該ツールがシステムの取りうる状態を調べ上げ、与えられたプロパティやアサーションが満たされるか否かを判定する。満たされない場合には、反例を出力する。
 ハードウェアとソフトウェアの複合動作や相互作用により発生する不具合をモデル検査で検出するには、例えば特許文献1に開示されているように、システムの検証モデルとして、ハードウェアなどの外部環境モデル(ソフトウェアに対する外部環境を表現する検証用モデル)と、ソフトウェアモデル(ソフトウェアを表現する検証用モデル)とを作成し、合成する必要がある。ソフトウェアモデルの生成には、ソースコードを変換する方法がある。ただしソースコードを全て検証用モデルに変換すると、メモリ不足による状態探索未完了の問題(状態爆発と呼ばれる)が発生する虞があるため、コードの一部を抽出するスライシングと呼ばれる処理がなされることもある。
特開2009-123159号公報
 特許文献1記載のように、ソースコードの一部を抽出してソフトウェアモデルに変換する場合、ソフトウェアモデルの入出力に関係するハードウェアや、検証項目に関係するが抽出されなかったソフトウェアは、外部環境モデルとする必要がある。検証者はこの外部環境モデルを、検証目的に応じて詳細なものにしたり、抽象度の高いものにしたりできる。ただしソフトウェアモデル、外部環境モデル、およびシステムの検証モデルを用意するのは一般的に手間が掛かる。
 また、特許文献1記載の技術では、外部環境モデルは、ソフトウェアのうち検査対象とする一部分の状態遷移情報から、検査対象外である他部分の挙動を模擬し、検査対象部分と他部分とのメッセージ通信を生成するものである。このため、検査対象とするソフトウェアの状態遷移情報がないと、外部環境モデルを生成できない。また、外部環境モデルにて故障などソフトウェアで想定していない挙動を取ることができない。
 このような制約を受けない外部環境モデルを検査に適用するには、検査対象とするソフトウェアに応じて外部環境モデルを用意するか、用意された外部環境モデルに応じてソフトウェアから検査対象を抽出する必要がある。このとき、ソフトウェアモデルの入出力と、外部環境の入出力とは整合しなくてはならない。このため、ソースコードから一部を抽出する際に、外部環境モデルの入出力と整合するように、外部環境との境界となる変数を決めて抽出範囲を調整する必要がある。または逆に、ソフトウェアモデルの入出力に合わせて、外部環境モデルを用意する必要がある。入出力が整合するには、変数が表現するデータの種別が同じであり、単位や値域が同じである必要がある。
 ソフトウェアモデルと外部環境モデルとの入出力を整合させるには、入出力となる変数の属性を一致させる必要があり、検証者は入出力変数の属性を調べる必要がある。一方で、コードの抽出範囲を過小に限定してしまうと、不具合の原因をモデル化できないため、不具合の原因をモデルに含めつつ状態爆発を回避して検証しようとするならば、ソフトウェアからコードを抽出する範囲を柔軟に調整する必要がある。しかし、抽出範囲を調整すると、調整の度に入出力変数が替わるため、変数の属性を調べなおさなければならず、規模が増大し複雑さが増しているソフトウェアについて、外部環境モデルと接続しうる変数を探索して、各変数の属性を調べることには多大な労力が必要となる。
 本発明はこのような課題に鑑みてなされたものであり、本発明の目的は、システムの検証モデルとして、ハードウェアなどの外部環境モデルとソフトウェアモデルとを作成して合成する際に、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減することにある。
 上記課題を解決するため本発明は、検証対象となるソフトウェアのソースコードを入力とし、前記ソースコードを解析して、モデル検査用のモデルを生成する検査用モデル生成プログラムにおいて、前記プログラムは、前記コンピュータに前記ソースコードの変数等の依存関係を導出する依存関係解析部と、前記ソースコードの一部の変数について属性情報を記録する変数属性記録部と、前記依存関係と前記変数属性記録部の属性情報から、前記ソースコードの各変数について属性を推論する変数属性解釈部と、前記属性情報を表示する変数属性情報表示部と、を有するように構成する。
 次に、外部環境モデルデータベースと、前記変数属性情報に応じて前記外部環境モデルデータベースから利用可能なモデルを引き出す外部環境モデル候補抽出部とを有するように構成する。
 次に、前記依存関係に対して範囲限定の指定を受け付ける依存関係限定部と、前記の限定された依存関係からソースコードのスライシングを行うソースコード抽出部と、前記の抽出されたソースコードから検査用のソフトウェアモデルを生成するモデル変換部と、前記外部環境モデル候補抽出部が引き出したモデルから利用するモデルを選ぶ外部環境モデル選択部と、前記ソフトウェアモデルと、前記外部環境モデル選択部が選んだ外部環境モデルとから、検査用のシステムモデルを合成するシステムモデル合成部と、を有するように構成する。
 検査用モデル生成プログラムが、変数の一部(マイコン入出力を行うレジスタ変数や、関数の引数など)に関する属性情報から、変数の依存関係を辿りつつ、他の変数の属性を推論することにより、前記プログラムのユーザは全ての変数について属性情報を自ら調査する必要が無くなり、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間が軽減される。
 また検査用モデル生成プログラムが、推論されたものを含む変数属性情報から、外部環境モデルとして利用可能なものをデータベースから抽出することにより、前記プログラムのユーザは外部環境モデルの選択に掛かる工数を低減することができる。
 またユーザが変数を1つ以上選択すると、検査用モデル生成プログラムが、選択された変数と依存関係のある変数の属性情報から、スライシング後のソフトウェアモデルに接続可能な外部環境モデルをデータベースから探索し、候補として提示する。逆に、外部環境モデルを選択すると、その外部環境モデルの入出力変数の属性から、接続可能なソフトウェアの変数を探索し、スライシングの条件(スライス基準)として設定することで、選択された外部環境モデルと接続可能なソフトウェアモデルの変換元となるソースコードを抽出する。以上により、ユーザが検証のためにハードウェアとソフトウェアの双方をモデル化する作業に掛かる工数を低減することができる。
本発明の構成を表す図である。 本発明の機能構成を表す図である。 変数の属性情報を推論する処理フローを表す図である。 属性推論処理の詳細な処理フローを表す図である。 解析対象例のソースコードを表す図である。 変数依存関係グラフの例を表す図である。 変数属性データベースに格納されているテーブルを表す図である。 推論ルールデータベースに格納されているテーブルを表す図である。 変数属性情報を表す図である。 変数属性情報を表す図である。 本発明の機能構成を表す図である。 システムの検証モデルを生成する処理フローを表す図である。 外部環境モデルの候補リストを表す図である。 システム検査用モデルを表す図である。
以下、図面を用いて本発明の実施形態について説明を行う。
 図1は、本発明をシステムとして実現した場合のシステム構成である。本発明は、例えばソフトウェアツールとして実現される。システム10において、処理を実行するためのソフトウェアは検証モデル生成プログラム1131として、例えばコンピュータ11上のROM113に格納されており、CPU111によって読み出され、RAM112を作業用記憶領域として用い、実行される。これにより、コンピュータ11は検証モデル生成プログラム1131によって規定された処理を実行する。その処理内容は図2以降で説明する。解析対象となるソースコードファイルは、コンピュータ11上のハードディスク114などの記憶装置に格納されている。解析実行指示などのユーザ操作は、キーボードなどの入力装置12から行うことができる。
 なお、検証モデル生成プログラム1131による出力は、例えばディスプレイなどの表示装置13になされるが、それ以外に、図示しない外部コンピュータへのネットワークを介した出力、CD-ROMなどの外部記憶媒体へのデータファイル形式での書き込みによる出力であってもよい。
 図2は、検証モデル生成プログラム1131の基本的な機能構成を示している。ファイル入力部21は、解析対象となるソースコードファイルをユーザが1ないし複数選択できる機能を有しており、ユーザによるファイル指定に従い、ソースコードファイルをコンピュータの記憶媒体(ハードディスク114など)から読み込む。依存関係解析部22は、ユーザが解析実行を指示すると、ファイル入力部21が読み込んだソースコードファイルを解析し、ソースコードから生成されるプログラムの依存関係を導出する。ここで依存関係とは、プログラムの実行順序により演算結果に影響のありうる関係のことであり、具体的には、ステートメント間の依存関係であるプログラム依存関係や、変数間の依存関係である変数依存関係である。プログラム依存関係を変数単位に分解すると変数依存関係になるので、プログラム依存関係と変数依存関係は情報としては等価とみなせる。プログラム依存関係や変数依存関係の導出方法については、文献に譲り、本明細書では割愛する。
 変数属性入力部23は、ソースコードに記述されたある変数に関する属性について、ユーザからの入力を受け付ける。以降では特に明記しない限り、変数の属性といえば、ソフトウェアモデルの入出力の整合に関係するものを指すとする。変数属性データベース24は、ファイル入力部21が読み込んでいるソースコードの一部の変数について、属性情報を記録している。変数属性解釈部25は、依存関係解析部22が導出した依存関係情報と、変数属性入力部23と変数属性データベース24のいずれか、または両方が持つ変数属性情報とから、ソースコードに記述された各変数の属性について、可能な限り推論を行う。推論には、推論ルールデータベース26に記録されたルールを用いる。変数属性表示部27は、変数属性解釈部25が推論した変数属性情報を、変数属性入力部23と変数属性データベース24の持つ変数属性情報と併せて、表示装置13に表示する。
 図3は、検証モデル生成プログラム1131が図2に示された機能を用いて行う処理であり、入力となるソースコードに記述された変数の属性情報を推論する処理のフローを示している。
 処理を開始すると、ステップ31にて、依存関係解析部22は、入力となるソースコードの依存関係を解析し、データとして出力する。例として、変数aと変数bについて、a=bという式がソースコードに記述されているとすると、変数依存関係としては「a←b」と表現できる。これは変数bが変数aに影響を与えるという意味である。逆に「a→b」と記述してもよく、表現のルールを決めればよい。本実施例では前者を採用する。また、aは依存元、bは依存先と呼ぶことにする。
 次にステップ32にて、変数属性解釈部25は、変数属性入力部23や変数属性データベース24から、入力となるソースコードに記述された変数の属性情報を取得し、依存関係解析部22の出力した依存関係データにおける各変数と対応付ける。なおステップ32は、該当する変数の属性情報が空のときだけ実行し、それ以外ではスキップする。
 次にステップ33にて、変数属性解釈部25は、依存関係データにおいて属性推論処理の始端となる変数を抽出する。本実施例では、入力となるソースコードがプログラムとして実行される際に入力となる変数の属性情報をもとに、前向きに(依存先の変数から、依存元の変数へ)属性情報の推論を進めるものとする。また、本実施例の処理は再帰的になっている。このため始端変数として、影響する変数がない、すなわちどの変数からも依存されていない(依存元になる変数が存在しない)変数を抽出する。ただし依存関係がループしており該当する変数が存在しない場合には、任意の変数を1つ選択する。
 次にステップ34にて、変数属性解釈部25は、対象とする始端変数のそれぞれについて、属性を推論する処理(詳細は図4に記載)を行う。ステップ34は、ステップ33にて抽出された全ての推論始端となる変数について、それぞれ実行する。以上をもって処理を終了する。
 なお、図3の処理を実行するタイミングは、ユーザによる実行指示時か、ユーザが変数属性入力部23に対し属性情報を入力したときとする。処理を終了したら、変数属性表示部27が、出力された依存関係情報を表示装置13に表示する。
 図4は、ある変数の属性情報を推論する処理であり、図3のステップ34(「属性推論」処理)の詳細フローを示している。
 処理を開始すると、ステップ41は、属性情報を推論する対象変数の全ての依存元変数について、それぞれ実行する。ステップ41にて、変数属性解釈部25は、対象とする依存元変数について、属性情報を推論する処理(図4の処理)を行う。次にステップ42にて、変数属性解釈部25は、対象変数と依存元変数とがデータ依存関係にあるかを判定する。データ依存関係であれば、対象変数の属性情報を更新する必要が無いので処理を終了し、そうでなければ、ステップ43に進む。次にステップ43にて、変数属性解釈部25は、いずれかの依存元変数の属性情報がステップ41にて更新されたか否かを判定する。1変数でも更新されていればステップ44に進み、1つも更新されていなければ、対象変数の属性情報を保持して、処理を終了する。次にステップ44にて、変数属性解釈部25は、対象変数が推論ルールデータベース26に記録されている推論ルールに該当するか否かを判定する。1ルールでも該当すればステップ45に進み、該当するルールがなければ、対象変数の属性情報を保持して、処理を終了する。次にステップ45にて、変数属性解釈部25は、ステップ44にて該当した推論ルールに基づき推論処理を実行し、その結果を対象変数の属性情報に反映する。以上をもって処理を終了する。なお上記は依存関係がループしていない場合の処理であり、ループが存在する場合には、1度「属性推論」処理の対象になった変数は対象外にすることが必要となる。
 以下では、図3と図4の処理例を示す。図5のソースコード50は、解析対象として検証モデル生成プログラム1131に入力する、C言語で記述されたソースコードの例である。左端の数字は行番号である。
 図6の変数依存関係グラフ61は、図5のソースコード50を依存関係解析部22が解析し出力する変数依存関係データをグラフ化したものである。この変数依存関係グラフ61は、例えば表示装置13に表示される。変数依存関係グラフ61のノードは、変数の名称や実体(記憶領域)だけでなく、記述位置(および実行パス)でも区別した変数である。例えば「stroke(L20@control)」と表記された変数は、ソースファイルの20行目、関数control内に記述された変数strokeであること意味している。変数の区別には、記述された行番号だけでなく列番号や、ソースファイル名を用いてもよい。また、図6のグラフには記載されていないが、各ノードには、変数の型のようにソースコードのみから判明する属性や、変数属性入力部23や変数属性データベース24から与えられた属性、変数属性解釈部25が推論した属性が対応付けられ、データとしてRAM112やハードディスク114に記憶されている。
 また図6において、依存関係を示すエッジ(矢印)、および演算式における関係を示すエッジ(破線)には、関係の種類を示すデータが対応付けられて記憶されている。依存関係のエッジにおいて、defは依存元の変数を依存先の変数が定義(代入などにより値を決めていること)を示している。useはデータ依存関係(依存元の変数が、依存先の変数の値を利用していること)を示している。condは制御依存関係(依存先の変数の値により実行パスが変わるため、依存元の変数の値に影響があること)を示している。
 図7の変数属性テーブル71は、変数属性データベース24に記録されている変数属性の例を示している。変数属性テーブル71の項目は、変数名、in/out(変数がプログラムの入力か出力か)、単位、データ種別からなる。これらの値は予め設定されている。変数reg_ad_1は、入力用の変数であり、データ種別は(例えば自動車のブレーキペダルの)ストローク量であることがわかる。またその単位は「(A/D変換値)」とあるが、これはA/D(Analog/Digital)変換により得られる値であり、単位は特に決められていないことを示している。
 図8の推論ルールテーブル81は、推論ルールデータベース26に記録されている推論ルールの例を示している。推論ルールテーブル81の項目は、前件と後件からなる。前件の条件が成立するときに、後件の条件も成立することを意味している。前件と後件は、述語論理で表現されている。これらの値は予め設定されている。
 推論ルールテーブル81の推論ルールNo.1にて、XとYはある変数を示しており、Def(X,Y)「XがYを定義している」ならば、SameAttr(X,Y)「YはXと同じ属性情報を有する」ことを意味している。
 推論ルールテーブル81の推論ルールNo.2にて、X,Y,Aはある変数を示しており、Cond(X,A)「AがXと制御依存関係にある(Aが依存元)」かつ、Cond(Y,A)「AがYと制御依存関係にある」かつ、Comp(X,Y)「XとYとは演算式内にて大小比較の関係にある(大小比較記号で結ばれている)」ならば、Flag(A)「Aは(異常などの)判定フラグであり、単位はなし」、かつSameAttr(X,Y)であることを意味している。なお、フラグAの判定対象とするデータ種別は、例えば変数Xのデータ種別とする。
 推論ルールテーブル81の推論ルールNo.3にて、X,Y,Zはある変数を示しており、Def(X,Y,Z)「XとYがZを定義している」かつ、Mul(X,Y)「XとYとは演算式内にて乗算の関係にある(乗算記号で結ばれている)」ならば、MulAttr(X,Y,Z)「Zのデータ種別はX(またはY)と同じであり、かつ、Zの単位はXとYの単位を乗じたもの」であることを意味している。同様に、和差算、除算についても推論ルールを記述することができる。
 推論ルールテーブル81の推論ルールNo.4にて、X,Yはある変数を示しており、Comp(X,Y)かつ、Vacant(Y)「Yの属性が空」ならば、Thrsh(Y)「Yのデータ種目は『閾値』である」であることを意味している。ただし、Thrsh(Y)に「?」が付いているのは、確定でないことを意味している。なお、閾値Yのデータ種別は、変数Xのデータ種別とする。
 推論ルールテーブル81の推論ルールNo.5にて、X,Y,Zはある変数を示しており、Def(X,Y,Z)かつ、Vacant(Y)ならば、SameAttr(X,Z)であることを意味している。ただし、SameAttr(X,Z)に「?」が付いており、確定でないことを意味している。
 推論ルールテーブル81の推論ルールNo.6にて、Y,Aはある変数を示しており、推論ルールNo.2の前件が成立し、かつErrThrsh(Y)「Yが異常閾値」ならば、ErrFlag(A)「Aは異常判定フラグ(異常を示すフラグ)」であることを意味している。前件に推論ルールNo.2を用いているので、No.6が優先されるとする。つまり、Flag(A)よりErrFlag(A)の適用が優先される。
 図9は、変数依存関係グラフ61のノードと対応付けられた変数属性テーブル91を示しており、図3の処理を1回実行した後の値が入っている。変数属性テーブル91の項目は、変数名、単位、データ種別からなる。
 変数属性テーブルにおいて、変数は実体で区別されており、記述位置では区別されていない。このため、変数依存関係グラフ61のノードと、変数属性テーブル91の行とは、n:1対応となっている。例えば変数strokeについて、変数依存関係グラフ61には対応するノードが2つあるが、変数属性テーブル91には対応する行は1つのみである。
 以下では、変数属性解釈部25が推論処理により変数属性テーブル91を生成する過程を説明する。変数属性解釈部25は、依存関係解析部22から変数依存関係グラフ61のデータを受け取り、変数依存関係グラフ61に含まれる変数から、変数属性テーブル91のデータ構造を生成する。この時点で、変数属性テーブル91には変数名のみが入っており、残りのデータは空である。各変数の属性情報の更新を示すフラグ(変数属性テーブル91に記載なし)はクリアする。
 次に変数属性解釈部25は、変数依存関係グラフ61に含まれる変数の属性情報を、変数属性データベース24の変数属性テーブル71から取得する。ただし本実施例では、入力用変数の属性情報のみを取得する。すると、変数reg_ad_1に関する属性情報が取得されるので、変数属性テーブル91に値を入れる。この際、変数reg_ad_1の属性情報の更新を示すフラグをセットする。
 次に変数属性解釈部25は、変数依存関係グラフ61の推論始端となる変数を抽出する。全ノードについて、依存元となる変数の有無を判定し、無いと判定されたノードだけ残すと、変数stroke(L20@control)が抽出される。この変数に対して、変数属性解釈部25は図4の「属性推論」処理を行う。
 変数stroke(L20@control)に対して「属性推論」処理が実行されると、「属性推論」は再帰的な処理となっているため、変数依存関係グラフ61の全ノードに対して「属性推論」処理が実行される。変数reg_ad_1(L7@input)は、依存先変数を持たないので、属性情報が保持される。この属性情報は、変数属性テーブル71から取得した値と同じである。
 次に、変数stroke_raw(L7@input)に対して、ステップ42~45の処理が実行される。依存先変数のreg_ad_1(L7@input)は、変数属性テーブル71から値を取得したことで、属性情報が更新されているので、推論ルールテーブル81から合致する推論ルールが検索される。合致する推論ルールとしてNo.1が抽出され(推論ルールのXがreg_ad_1,Yがstroke_raw)、stroke_rawの属性は、reg_ad_1と同じ内容に更新される。
 同様に他の変数の属性情報も更新していく。変数stroke_raw(L16@convert)と変数stroke_raw(L10@check)は、変数stroke_raw(L7@input)とデータ依存関係なので、属性情報は更新しない(更新済みである)。
 変数stroke_max(L10@check)は、推論ルールテーブル81の推論ルールNo.4に合致するので、データ種別は「ストローク量に対する閾値」、単位は「(A/D変換値)」と判定される。ただし確定ではないので、属性値に「?」が付いている。
 変数err_stroke(L11@check)は、推論ルールテーブル81の推論ルールNo.2に合致する(推論ルールのXがstroke_raw,Yがstroke_max,Aがerr_stroke)ので、後件のFlag(A)から、err_strokeの属性情報について、データ種別はストローク量に対する判定フラグであり、判定フラグなので単位はなしに更新される。またSameAttr(X,Y)から、stroke_maxの属性は、stroke_rawと同じ内容に更新される。
 変数err_stroke(L15@convert)はerr_stroke(L11@check)とデータ依存関係なので、属性情報は更新しない。
 変数stroke(L16@convert)は、推論ルールテーブル81の推論ルールNo.3に合致する(推論ルールのXがstroke_raw,Yがc_in_stroke,Zがstroke)。しかし、c_in_strokeの属性情報が空であり不明なので、推論を進めることはできない。その一方で、推論ルールNo.5にも合致するので、strokeデータ種別は「ストローク量」と判定される。ただし確定ではないので、属性値に「?」が付いている。
 以上で、図3の処理を終了する。同様にして、出力用変数の属性情報をもとに、後ろ向きに推論を進めてもよい。
 以上のようにして、一部の変数の属性情報から、他の変数の属性情報を自動的に推論することができ、ユーザが手作業で変数の依存関係を追跡し、属性情報を解釈していくより、短い時間で変数の属性情報を得ることができる。
 図10は、ユーザからの変数属性情報の入力を受けて図3の推論処理を再度実行し、変数属性テーブル91を更新した変数属性テーブル101を示している。
 変数属性テーブル91の値が推論処理により導出された後で、ユーザが変数属性入力部23に対し、変数stroke_maxのデータ種別が「異常閾値」、単位が「(A/D変換値)」であると入力する。これらの属性値は、データ種別と単位と、それぞれに取りうる値が用意されており、候補としてリスト表示される。ユーザは表示装置13上でリストを目視し、入力装置12から選択の上、確定させる。検証モデル生成プログラム1131内では、データ種別の候補として、「閾値」や「異常閾値」などが予め定義されている。また、「異常閾値」は「閾値」の下位概念であると定義されている。このため、変数stroke_maxのデータ種別が「閾値」のときは、リスト上で現在の値として「閾値」が選択状態にあり、その次の候補として下位概念である「異常閾値」がリスト上で順に表示される。
 ユーザが属性情報の入力を確定させると、検証モデル生成プログラム1131は図3の推論処理を実行する。すると変数err_strokeの属性情報が、推論ルールNo.6により更新され、データ種別は「ストローク量の異常判定フラグ」となる。
 さらにユーザが変数c_in_strokeの属性情報として、データ種別を「係数」、単位を「cm/(A/D変換値)」と入力して確定させると、検証モデル生成プログラム1131は図3の推論処理を実行し、変数strokeの属性情報が推論ルールNo.3により更新され、データ種別は「ストローク量」、単位は「cm」となる。単位を示すデータは、分子と分母とそれぞれに要素を用意して、分子と分母で重複するものを除去すればよい。なお、単位系の演算規則は、推論ルールテーブル81と同様に、検証モデル生成プログラム1131内に定義しておくものとする。
 以上のようにして、ユーザが変数の属性情報を追加入力することで、属性情報を推論できる変数の個数を増やし、全変数に対する割合を向上させることができるので、ユーザが手作業で変数の属性情報を解釈するより、さらに短い時間で変数の属性情報を得ることができる。
図11は、検証モデル生成プログラム1131の機能構成を示しており、これらの機能は図2の基本機能構成と併せて動作する。
 依存関係限定部111は、依存関係解析部22から解析対象のソースコードに関する依存関係情報を受け取り、依存関係情報に含まれる各変数について個別に、ソースコード抽出時に残すか否かのデータ(残存設定データ)と対応付けて管理する。残存設定データは2値(True;残す、False;残さない)で示され、依存関係情報のうちソースコード抽出に利用する範囲を限定する意味がある。残存設定データの初期値は、例えば全変数についてTrueとする。また依存関係解析部22は、ユーザ入力や外部環境モデル選択部116からの指定を受けて、残存設定データを変更する。
 依存関係情報において、ソースコード抽出時に残る設定となっている変数と、残らない設定となっている変数とに依存関係があるとき、残る変数がソフトウェアモデルと外部環境モデルとの境界になる。以下、このような変数を境界変数と呼ぶ。例えば変数依存関係グラフ61において、stroke_raw(L7@input)を残すと設定し、reg_ad_1(L7@input)を残さないと設定したとき、stroke_raw(L7@input)は境界変数である。
 依存関係解析部22の残存設定データに対する、ユーザ入力や外部環境モデル選択部116からの指定内容は、各変数の残存設定でもよいし、境界に指定する変数でも良い。例えばstroke_raw(L7@input)を入力側の境界変数に指定するとき、stroke_raw(L7@input)の残存設定はTrueとなり、reg_ad_1(L7@input)の残存設定はFalseとなる。
 ソースコード抽出部112は、ファイル入力部21から解析対象のソースコードを受け取り、依存関係限定部111による依存関係情報とその残存設定データとに基づいて、ソースコードの抽出(スライシング)を行う。抽出したソースコードはファイルに出力する。スライシングの方法として例えば、ソースコードを構文解析した後、依存関係情報に含まれる変数のうち、残存設定がTrueの変数が記述されているステートメント、およびそのステートメントを包含する構文(関数など)、関連する構文(変数宣言など)を残し、それ以外のコードを除去する。
 モデル変換部113は、ソースコード抽出部112が出力するスライシング後のソースコードを、モデル検査器が扱えるモデル記述言語に変換する。例えばSPIN(Simple Promela INterpriter)というモデル検査器では、モデル記述言語はPromelaである。モデル変換の方法として、ソースコードを構文解析した後、ソースコードの構文から、モデル記述言語の構文へ変換する規則に基づいて各構文を変換する。この変換規則は予め用意しておく。変換により得られるモデルは、検査対象となるソフトウェアに関する検証用モデルであり、検査対象となるシステムに関する検証用モデルの部品である。
 外部環境モデルデータベース114は、検証対象となるソフトウェアの外部環境について予めコーディングまたは自動コード生成用にテンプレート化されたモデル部品について、属性と紐付けられて記憶されている。外部環境モデル候補抽出部115は、依存関係限定部111から残存設定データと対応付けられた依存関係情報を、変数属性解釈部25から検証対象となるソフトウェアの各変数の属性情報を受け取り、残存設定がTrueとなっている変数の属性情報の一部(データ項目や単位など)を検索キーとして、インタフェースが合致する外部環境モデルを、外部環境モデルデータベース114より抽出する。抽出された外部環境モデルは、検証対象となるソフトウェアの外部環境となりうるモデルである。
 外部環境モデル選択部116は、外部環境モデル候補抽出部115により抽出された外部環境モデルの属性(名称等)を、ユーザに対して表示装置13を用いてリスト表示し、ユーザからの各外部環境モデルの利用有無について、入力装置12から指定を受け付ける。利用有無は、デフォルトでは「なし」である。ユーザが外部環境モデルの1つについて、利用有無を「あり」に指定すると、選択された外部環境モデルのインタフェースとなっている変数の属性情報が、依存関係限定部111に渡され、依存関係限定部111は検証対象となるソフトウェアの変数のうち、外部環境モデルのインタフェース変数と属性が合致する変数を依存関係情報から検索し、境界変数として残存設定を変更する。具体的には、境界変数は残す設定とする。インタフェース変数が入力のとき、境界変数から依存元方向(より出力に近い方)の変数は、残らない設定の変数を残る設定に変更する(例えば残存設定がTrueの変数が出現するまで)。また、境界変数から依存先方向(より入力に近い方)の変数は、残らない設定とする。インタフェース変数が出力のときには、入力のときと残存設定の変更が逆になる。なお外部環境モデル選択部116は、利用有無が「あり」に指定された外部環境モデルをファイルに出力してもよい。
 モデル合成部117は、モデル変換部113が出力するソフトウェアモデルと、外部環境モデル選択部116にて利用ありに指定された外部環境モデルとから、検証対象となるシステムの検証モデルを合成する。この際、外部環境モデルのインタフェース変数と、対応するソフトウェアの境界変数とで、一致しない属性情報がある場合、外部環境モデルのインタフェース変数の属性情報を変更する。例えば、インタフェース変数の名称を、境界変数の名称と同一に変更する。合成された検証モデルは、ハードディスク14にファイルとして出力される。
 図12は、検証モデル生成プログラム1131が図2や図11に示された機能を用いて行う処理であり、システムの検証モデルを生成する処理のフローを示している。
 処理を開始すると、ステップ121にて、検証モデル生成プログラム1131は、図3の処理を行い、検証対象となるソフトウェアの依存関係情報を生成する。依存関係解析部22から、依存関係限定部111に、依存関係情報が渡されて管理される。
 ステップ122にて、外部環境モデル候補抽出部115は、ステップ121にて出力された依存関係情報をもとに、外部環境モデルデータベース114から外部環境モデルの候補を抽出する。
 ステップ123にて、検証モデル生成プログラム1131は、入力装置12からのユーザ入力を確認する。ユーザ入力がある変数の残存設定を変更するものであれば、ステップ124に進む。ユーザ入力が外部環境モデル候補抽出部115の抽出したある外部環境モデルの利用有無設定を変更するものであれば、ステップ125に進む。ユーザ入力がシステムの検証モデル合成を指示するものであれば、ステップ127に進む。
 ステップ124にて、依存関係限定部111は、ユーザ入力に従って依存関係情報における各変数の残存設定を変更し、ステップ122に戻る。ステップ122では、各変数の残存設定の変更に対応して、外部環境モデル候補の抽出を再度実行する。
 ステップ125にて、外部環境モデル選択部116は、ユーザ入力に従って各外部環境モデルの利用有無設定を変更し、ステップ126に進む。ステップ126にて、依存関係限定部111は、ステップ125にて利用ありと設定された外部環境モデルの、インタフェース変数の属性から、検証対象となるソフトウェアにて対応する境界変数を検索し、依存関係情報における各変数の残存設定を変更する。変更が完了したら、ステップ123に戻る。
 ステップ127にて、ソースコード抽出部112は、変数の残存設定を付与された依存関係情報を利用してソースコードの抽出を行う。ステップ128にて、モデル変換部113は、ステップ127にて抽出されたソースコードを、ソフトウェアの検証用モデルに変換する。ステップ129にて、モデル合成部117は、ステップ128にて出力されたソフトウェアの検証モデルと、ステップ125にて利用ありと設定された外部環境モデルとから、システムの検証モデルを合成して出力する。以上により処理を終了する。
 図13の外部環境モデル属性テーブル131は、外部環境モデルデータベース114に記録されている外部環境モデルに関する属性情報の例であり、このテーブルも外部環境モデルデータベース114に記録されている。変数属性テーブル131の1行は1つの外部環境モデルに紐付いており、項目は外部環境モデル名、インタフェース変数名、in/out(インタフェース変数が入力か出力か)、(インタフェース変数の)単位、(インタフェース変数の)データ種別、(外部環境モデルの)抽象度からなる。これらの値は予め設定されている。
 外部環境モデル属性テーブル131には、Stroke1、Stroke2、Stroke3の3つの外部環境モデルが登録されており、どれもインタフェース変数のデータ種別は「ストローク量」、入出力は「入力」である。一方で、インタフェース変数の単位は、Stroke1とStroke2が「(A/D変換値)」、Stroke3は「cm」となっている。
 外部環境モデル候補抽出部115は、図10の変数属性テーブル101を変数属性解釈部25から受け取り、外部環境モデル属性テーブル131とデータ種別および単位が合致する外部環境モデルを抽出する。すると、変数reg_ad_1とstroke_rawに対してはStroke1とStroke2が、変数strokeに対してはStroke3が抽出され、外部環境モデル選択部116にその属性情報と共に渡される。
 また依存関係限定部111は、外部環境モデル選択部116から、Stroke1~Stroke3のうち、ユーザに利用ありと設定された外部環境モデルのインタフェース変数に関する属性情報を受け取り、依存関係情報における各変数の残存設定を変更する。例えばユーザがStroke3を利用ありに設定したとき、そのインタフェース変数のデータ種別「ストローク量」と単位「cm」が依存関係限定部111に渡され、依存関係限定部111は対応する変数strokeを境界変数として扱う。
 図14の検証用モデル140は、検証対象システムについてモデル合成部117が出力する検証用モデルの例である。なお検証用モデル140を出力する前提として、外部環境モデル選択部116では外部環境モデルとしてStroke3がユーザ入力により利用ありに設定されており、依存関係限定部111ではユーザ入力により変数err_strokeの残存設定がFalseにされているとする。またモデル合成部117が利用する変換ルールは、C言語の関数をPromelaのインラインマクロに置換し、関数コールグラフにてどの関数からも呼び出しされていない関数に対応するインラインマクロを実行するプロセスを追加するとしている。
 検証用モデル140は、4つの部分から成っている。検証用モデル部品141は、ソフトウェアモデルと外部環境用モデルにて使用されている変数や固定値の宣言を、モデル合成部117がまとめたものである。検証用モデル部品142は、外部環境モデルデータベース114に記録されている外部環境モデルStroke3のコードについて、インタフェース変数名を境界変数strokeの名称に変更したものである。検証用モデル部品143は、モデル変換部113が変換して出力したソフトウェアの検証用モデルについて、さらにモデル合成部117が、境界変数stroke(14行目)に値を代入する構文を、外部環境モデルStroke3のインラインマクロ呼び出しに置換したものである。このようなインラインマクロへの置換は、予め変換ルールとして決めておく。検証用モデル部品144は、モデル合成部117にて追加されたプロセスである。
 以上のようにしてシステムの検証用モデルをプログラムが合成することにより、ユーザは外部環境モデルの選択に掛かる工数や、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減させることができる。またさらに、ユーザがソフトウェアとその外部環境の双方をモデル化する作業に掛かる工数を低減することができる。
11 コンピュータ
111 CPU
112 RAM
113 ROM
1131 検証モデル生成プログラム
12 入力装置
13 表示装置
114 ハードディスク
21 ファイル入力部
22 依存関係解析部
23 変数属性入力部
24 変数属性データベース
25 変数属性解釈部
26 推論ルールデータベース
27 変数属性表示部

Claims (9)

  1. コンピュータにソフトウェアのソースコードを入力させ、前記ソフトウェアの検証を行うためのソフトウェア検証用プログラムにおいて、
    前記ソースコードに対して命令または変数の依存関係を導出する依存関係解析部と、
    前記ソースコードの一部の変数について属性情報を記録する変数属性記録部と、
    前記依存関係と前記変数属性情報から、前記ソースコード中の各変数について、予め設定された推論ルールに従って属性情報を推論する変数属性解釈部と、
    前記属性情報を表示する変数属性情報表示部と、を備えることを特徴とするソフトウェア検証用プログラム。
  2. ユーザによる変数属性情報の入力を受け付ける変数属性入力部を備え、
    前記変数属性解釈部は、前記ソースコードの各変数に関する属性情報の推論に、前記変数属性部に入力された変数属性情報を利用することを特徴とする請求項1記載のソフトウェア検証用プログラム。
  3. 外部環境モデルをその属性情報と共に記録する外部環境モデルデータベースと、
    前記外部環境モデルデータベースから、前記ソースコードを変換したソフトウェアモデルの外部環境となりうるモデルを抽出する外部環境モデル抽出部と、を備え、
    前記外部環境モデル抽出部は、前記依存関係に含まれる変数属性情報から、インタフェースの属性が合致する外部環境モデルを検索して、前記ソフトウェアモデルに接続可能な外部環境モデルの候補として出力することを特徴とする請求項1記載のソフトウェア検証用プログラム。
  4. 前記依存関係についてソースコード抽出のための命令または変数の残存設定の変更をユーザから受け付ける依存関係限定部を備え、
    前記外部環境モデル抽出部は、前記依存関係限定部により残存設定が変更された前記依存関係にもとづき、前記インタフェースと属性が合致する変数としては前記残存設定が残る様に設定されている変数のみを用い、前記外部環境モデルデータベースから抽出する外部環境モデルの候補を絞り込むことを特徴とする請求項3記載のソフトウェア検証用プログラム。
  5. 前記依存関係についてソースコード抽出のための命令または変数の残存設定を変更する依存関係限定部を備え、
    前記外部環境モデル抽出部は前記外部環境モデルデータベースから抽出された外部環境モデルに対するユーザによる選択を受け付け、ユーザが前記外部環境モデルを選択すると、前記依存関係限定部は、選択された前記前記外部環境モデルの属性情報からインタフェースが合致する変数を前記依存関係から検索し、前記ソースコードを変換したソフトウェアモデルと、前記外部環境モデルとの境界となる変数として、前記依存関係の残存設定を変更することを特徴とする、請求項3記載のソフトウェア検証用プログラム。
  6. 前記依存関係から前記ソースコードの一部を抽出するソースコード抽出部と、前記ソースコード抽出部によるソースコードを変換してソフトウェアモデルとするモデル変換部と、前記モデル変換部によるソフトウェアモデルと前記外部環境モデル抽出部による外部環境モデルとを合成して、前記ソフトウェアを含むシステムの検証用モデルを出力するモデル合成部と、を備え、
    前記モデル合成部は、前記ソフトウェアモデルと、前記外部環境用モデルとのインタフェースについて両者が整合するように修正を行うことを特徴とする請求項3から5いずれか一項に記載のソフトウェア検証用プログラム。
  7. 前記変数属性解釈部は、前記依存関係中で、どの変数からも依存されていない変数を始端変数として選択し、依存先の変数から依存元の変数へと属性情報の推論を行うことを特徴とする請求項1記載のソフトウェア検証用プログラム。
  8. 前記変数属性解釈部は、前記依存関係中にループがあるときに、一度属性情報の推論を行った前記ループに属する変数については、推論の対象外とすることを特徴とする請求項1記載のソフトウェア検証用プログラム。
  9. ユーザからの入力を受け付ける入力装置と、ユーザへの出力を表示する表示装置と、請求項1記載のソフトウェア検証用プログラムを実行するコンピュータと、を備えるソフトウェア検証システム。
PCT/JP2013/069967 2012-08-31 2013-07-24 ソフトウェア検証用プログラムおよびソフトウェア検証システム WO2014034330A1 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
EP13833807.4A EP2891983A4 (en) 2012-08-31 2013-07-24 SOFTWARE VERIFICATION PROGRAM AND SOFTWARE VERIFICATION SYSTEM

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2012-190826 2012-08-31
JP2012190826A JP6002507B2 (ja) 2012-08-31 2012-08-31 ソフトウェア検証用プログラムおよびソフトウェア検証システム

Publications (1)

Publication Number Publication Date
WO2014034330A1 true WO2014034330A1 (ja) 2014-03-06

Family

ID=50183150

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/JP2013/069967 WO2014034330A1 (ja) 2012-08-31 2013-07-24 ソフトウェア検証用プログラムおよびソフトウェア検証システム

Country Status (3)

Country Link
EP (1) EP2891983A4 (ja)
JP (1) JP6002507B2 (ja)
WO (1) WO2014034330A1 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016091087A (ja) * 2014-10-30 2016-05-23 富士通株式会社 情報提示プログラム、情報提示方法及び情報提示装置
CN113449151A (zh) * 2021-06-11 2021-09-28 西安电子科技大学 一种通讯软件的安全性的自动化验证方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH11203116A (ja) * 1998-01-14 1999-07-30 Fujitsu Ltd 変数分類装置およびそのプログラムを格納した記憶媒体
JP2005018114A (ja) * 2003-06-23 2005-01-20 Internatl Business Mach Corp <Ibm> プログラム保守支援装置、プログラム保守支援方法、およびプログラム
JP2009123159A (ja) 2007-11-19 2009-06-04 Nec Corp 情報処理システム、情報処理方法、および情報処理プログラム

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101763304A (zh) * 2009-12-31 2010-06-30 合肥工业大学 一种基于证据理论的不确定型软件可信性评估方法
US8719793B2 (en) * 2010-12-08 2014-05-06 Nec Laboratories America, Inc. Scope bounding with automated specification inference for scalable software model checking

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH11203116A (ja) * 1998-01-14 1999-07-30 Fujitsu Ltd 変数分類装置およびそのプログラムを格納した記憶媒体
JP2005018114A (ja) * 2003-06-23 2005-01-20 Internatl Business Mach Corp <Ibm> プログラム保守支援装置、プログラム保守支援方法、およびプログラム
JP2009123159A (ja) 2007-11-19 2009-06-04 Nec Corp 情報処理システム、情報処理方法、および情報処理プログラム

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
See also references of EP2891983A4 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016091087A (ja) * 2014-10-30 2016-05-23 富士通株式会社 情報提示プログラム、情報提示方法及び情報提示装置
CN113449151A (zh) * 2021-06-11 2021-09-28 西安电子科技大学 一种通讯软件的安全性的自动化验证方法
CN113449151B (zh) * 2021-06-11 2022-09-20 西安电子科技大学 一种通讯软件的安全性的自动化验证方法

Also Published As

Publication number Publication date
EP2891983A1 (en) 2015-07-08
EP2891983A4 (en) 2016-04-20
JP2014048856A (ja) 2014-03-17
JP6002507B2 (ja) 2016-10-05

Similar Documents

Publication Publication Date Title
JP5775829B2 (ja) ソフトウェアの構造可視化プログラムおよびシステム
US8768651B2 (en) System and method for automatic standardization and verification of system design requirements
Campos et al. Model checking interactor specifications
CN104899147B (zh) 一种面向安全检查的代码静态分析方法
JP5874891B2 (ja) プログラムテスト装置、プログラムテスト方法、およびプログラム
US20070266378A1 (en) Source code generation method, apparatus, and program
JP2007323573A (ja) 機能テスト・スクリプト生成装置
JP6316120B2 (ja) テストケース生成システム及びテストケースを記録した記録媒体
US20090319246A1 (en) Detection program, detecting device, and detecting method
WO2012104907A1 (ja) プログラムの実行性能評価のためのテストデータ生成方法
Hilken et al. Verifying linear temporal logic properties in UML/OCL class diagrams using filmstripping
JP6002507B2 (ja) ソフトウェア検証用プログラムおよびソフトウェア検証システム
Schlie et al. Clustering variation points in matlab/simulink models using reverse signal propagation analysis
JP2012181666A (ja) 情報処理装置、情報処理方法及び情報処理プログラム
Schmidt et al. Automatic generation of thread communication graphs from SystemC source code
US20190163844A1 (en) Checking equivalence between changes made in a circuit definition language and changes in post-synthesis nets
JP2006277282A (ja) モデル評価解析システムおよびモデル評価解析プログラム
JP2017224185A (ja) バグ混入確率計算プログラム及びバグ混入確率計算方法
US20170131973A1 (en) Software specification dependence relation verification apparatus and software specification dependence relation verification method
JP2015133031A (ja) プログラム分析装置及びプログラム分析方法
JP6748357B2 (ja) 解析装置、解析プログラムおよび解析方法
JP2006190085A (ja) デジタル回路のモデリング方法及び設計方法
US11782682B2 (en) Providing metric data for patterns usable in a modeling environment
KR102052338B1 (ko) 테스트케이스 설계 정보의 추적 분석을 위한 시각화 방법, 테스트케이스 생성 장치 및 컴퓨터 판독가능 기록매체
JP7059827B2 (ja) ソースコード生成装置

Legal Events

Date Code Title Description
121 Ep: the epo has been informed by wipo that ep was designated in this application

Ref document number: 13833807

Country of ref document: EP

Kind code of ref document: A1

REEP Request for entry into the european phase

Ref document number: 2013833807

Country of ref document: EP

NENP Non-entry into the national phase

Ref country code: DE