JP4958574B2 - プログラム論理の検証方法、プログラム論理の検証プログラム - Google Patents

プログラム論理の検証方法、プログラム論理の検証プログラム Download PDF

Info

Publication number
JP4958574B2
JP4958574B2 JP2007031369A JP2007031369A JP4958574B2 JP 4958574 B2 JP4958574 B2 JP 4958574B2 JP 2007031369 A JP2007031369 A JP 2007031369A JP 2007031369 A JP2007031369 A JP 2007031369A JP 4958574 B2 JP4958574 B2 JP 4958574B2
Authority
JP
Japan
Prior art keywords
program
mapping
error
microprocessor
program code
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
JP2007031369A
Other languages
English (en)
Other versions
JP2008197851A (ja
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 JP2007031369A priority Critical patent/JP4958574B2/ja
Publication of JP2008197851A publication Critical patent/JP2008197851A/ja
Application granted granted Critical
Publication of JP4958574B2 publication Critical patent/JP4958574B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Description

本発明は、プログラム論理の検証技術に関し、たとえば、手続き型プログラミング言語のプログラムコードの検証等に適用して有効な技術に関する。
近年、金融、医療、通信、交通、教育、防犯など社会のさまざまな分野でコンピュータが利用され、我々は利便性を享受している。
ところが、コンピュータソフトウェアの不具合が原因による銀行業務の停止や証券業務の停止、混乱、鉄道交通システムの混乱などが多発し、日本のみならず、世界中がこの脅威にさらされている。
ソフトウェア開発者や関係会社は設計段階でのロジックチェック体制の強化や、プログラムテストを入念に行うなど対策を行っているが、テストデータでのチェックでは、データ数に限界があり、すべての場合の動作保証はできない問題がある。たとえば、想定外のデータ入力やデータどうしの関係、複合条件により不具合となる場合が多い。
一般的なソフトウェアテストは、テストデータでのチェックであり、不具合を起こすパラメータそのものを与えること及びそのパラメータの存在を証明することができない。
また、手続き型言語のプログラムコードには、変数の定義、関数の定義、写像力学系の定義と、if,switchなどで与えられる関数部分の操作、while文で与えられる写像力学系部分の操作が、混合して記述されており、関数部分の操作の論理的整合性、写像力学系部分の操作の論理的整合性を体系的に検証できなかった。そのため、コンピュータソフトウェアの不具合が原因による銀行業務の停止や証券業務の停止、混乱、鉄道交通システムの混乱を回避する決定打が存在しなかった。
以下、従来におけるコンピュータソフトウェアの検証技術について概観する。なお、本発明者らの未発表の論文に基づいて本明細書を作成するため、原論文の章立てを踏襲し、従来技術については、原論文の第1章の開示内容を記載し、後述の実施の形態には、原論文の第2章以降を記載している。
第1章 序論
図1は、非特許文献1に掲載された、手続き型プログラミング言語の一種のMatlab(数値解析ソフトウェア)(登録商標)による標準的な二分法プログラムのソースコードである。このプログラムは実際にMatlab上で使用することができる。しかしこのプログラムは本当に何の問題も無いのであろうか。
一般的にコンパイル時にエラーも無く一見何も問題が無いように見えても、実際に使用した時に意図しない挙動をしてしまうというのはソフトウェアの世界ではよくあることである。
このようなプログラムが本当に正しく作動するかどうか確かめる方法とこのようなプログラムが、複数のコンピュータ上で並列分散されても正しく作動するかどうか確かめる方法を確立することが、ソフトウェア開発では重要な技術的課題となっている。
以下に、本発明に関連する従来の研究について、非特許文献2,非特許文献3を参照してまとめる。
1.1プログラムの品質
プログラムの品質を分類する試みがいくつか存在する。例えば、C.A.R.Hoare は17項目の品質のリストを提案している。1976年の第2回ソフトウェア工学国際会議において、B.W.Boehomが品質を3レベルに階層化して分類した表を発表している。その一番下のレベルでは正確さ・安全性・装置効率など15の性質が列挙されている。
本明細書において、プログラムの品質の中でプログラムの信頼性に注目する。プログラムの信頼性とは、プログラムが仕様に定められた機能をいかに正しく実現しているか、ということである。機能の実現の仕方から誤りが無いかというだけでなく、仕様に定められた機能は漏れなく実現しているかという意味での完全性の要求も含まれる。さらに仕様が定められた入力条件を満たさないでデータが入力された場合にもプログラムが暴走するなどの異常事態を引き起こさないという頑健性も重要である。
このようなプログラムの品質を調べるには、そのプログラムが正しく作動するかを確かめなければならない。プログラムの品質を保証するにはプログラムに対するテストが重要な役割を担っている。
1.2プログラム検証論
プログラム検証論は1960年代から盛んに研究されているが、1995年にはかなり下火になっている。しかし構造化プログラミングや言語設計に影響を与えて、「プログラミングの正しさ」の証明方法の研究は、形をかえてソフトウェア工学に引き継きつがれている。
プログラム検証論は、「ホーア論理」をベースとしている。このホーア論理(Hoare Logic)では、正しさの問題を、より小さなプログラムの正しさの問題に帰着させる。ホーアはプログラムの最初と最後に「表明」と呼ばれる条件を付加した形式を考案し、これをもとにプログラムを検証する「論理学的方法」を作った。「表明」は普通の数学の命題と同じ方法でその正しさを確認できる。ホーア論理の証明とは、「プログラムの正しさ」を「表明の正しさ」に還元する方法であり、最後まで証明の面倒をみるのではなく最後は数学などの証明力に責任転嫁してしまう。
1.2.1 ホーア論理の理論的限界
ホーア論理の理論的限界として、Algo−likeなプログラム言語に対しては(健全で)相対完全なホーア論理を作ることができないということが挙げられている。Algo−likeな、とは、1.手続き(=関数)を定義することができ、局所手続き(=goto文)も定義できる、2.手続きを手続きの引数として渡すことができる、3.再帰呼び出しができる、4.静的スコープルールを使える、5.大域変数を使える、といった特徴を備えることをいう。
またプログラム検証全般の現実的限界として、第1に、仕様記述と証明コストが膨大、第2に、証明にバグがないという保証がない、第3に、仕様にバグがないという保証がない、という問題点もあり1980年代には、「プログラム検証は不可能である」という意見が支配的になり、実現されたシステムが「仕様」を満たしているか?ということを確認する「検証」の手法としては実っていない。しかしシステムが「要求」に対して正しく作られているか?を確認する「有効性確認」にホーア理論が用いられるなど、「現実のプログラムの安全性を保証する」研究はソフトウェア工学として発展している。
1.3ソフトウェア工学におけるテスト技法
ソフトウェア工学などと言われる前からソフトウェアに対するテストは広く行われてきたが、1960年代末からのソフトウェア工学の大きなうねりはテストの考えにも様々な影響を与えた。
1. テスト技術の研究
テストが工学的な分析の対象として意識的に研究され、その結果が実践され始めた。代表的な技術としては経路解析やテストデータ生成などが挙げられる。
2. テストツールの作成・利用
ソフトウェア工学の浸透に伴い、ソフトウェア開発を助けるツールの作成・利用が一般化したが、テストの分野でもテストベッド・テストカバレージ計測などのツールが作られ、使用され始めた。
3.ライフサイクルでのテストの位置づけ
ソフトウェアのライフサイクルという概念が重視されるようになった。ライフサイクル・モデルではソフトウェアの誕生から死までをいくつかのフェーズに分ける。典型的な分割は要求定義・設計・プログラミング・テスト・運用保守というフェーズわけである。そこでテストは1つのフェーズという位置づけを与えられたとともに、先行する各フェーズとテストとの関係も明確化された。即ち要求仕様に対するテストとして受け入れテスト(あるいはシステムテスト)、設計に対するテストとして統合テスト、プログラムに対するテストとして単体テスト、というようにテストの対象となるべき基準が明らかになった。
4.正当性証明技法の研究
プログラムの正当性証明技法は、1970年代半ばから末にかけ、理論的な研究が進められるとともに、実験的なシステムもいくつか作られ、ソフトウェア工学の中で活気のあるテーマのひとつとなった。これらの研究はその後、大規模プログラムに適用できるような実用段階にまで育ってきてはいないが、種々の点で従来からのテスト技術にも影響を与えた。
5. テスト効果の計測
ソフトウェア工学では開発や保守のコストに対して目が向けられたことも1つの大きな特徴となっているが、その結果テストにもコスト意識が持ち込まれてきている。例えばテストにかかるコストはプログラムの開発コストの50%を占めるといった数字がよく挙げられる。テストの場合はテスト自身の効率を上げてコストを下げるという面と効果的なテストを行いバグを早期に発見して取り除くことにより、ライフサイクル全体を通してのコスト削減に寄与するという面との両面を考えなくてはならない。いずれにせよテストの効果を評価することが必要で、そのために故障率の測定などが工夫され、さらには信頼性モデルなどの分析手法も研究され始めた。
1.4アルゴリズムの数学モデル
またプログラムとは別の観点からソフトウェアの動作を把握しようとする取り組みもある。1989年にL.Blum,M.Shub,S.Smaleの三名によってコンピュータ上の演算における力学系理論的定式化が提唱された。これはアルゴリズムや演算処理を数学関数や写像としてモデル化したものである(非特許文献4,非特許文献5,非特許文献6,非特許文献7、参照)。
しかしながら、いずれの方法もプログラムの動きを完全に把握しているとは言い難い現状である。
A.Neumaier, Introduction to Numerical Analysis,Cambridge University Press,2001. 玉井哲雄,松田茂広,三嶋良武,ソフトウェアのテスト技法,共立出版,1988. 林晋,プログラム検証論,共立出版、1995年. L.Blum,M.Shub and S.Smale,On a Theory of Computation and Complexity over the Real Numbers:NP-Copleteness, Recursive Functions and Universal Machines,Bull.Amer.Math. Soc.(N.S.)Vol.21,no.1,pp.1-46(1989). (ed.)F.Cucker,and (ed.)R.Wong,The Collected Papers of Stephen Smale,World Scienti?c Pub.Co.Inc.,2000. L.Blum,Lectures on a Theory of Computation and Complexity over the Reals(or an Arbitrary Ring),1989 Lectures in Complex Systems, SFI Studies in the Scenics of ComplexityLect. Vol.II, Addison-Wesley,pp.1-46(1990). S.Smale, Some Remarks on the Foundations of Numerical Analysis,SIAM Review Vol.52,no.2,pp.211-220(1989).
本発明の目的は、テストデータチェックやロジックチェックでは検出が困難なソフトウェアの不具合(バグ)を数学的見地から検証する方法を提供することにある。
本発明の第1の態様は、マイクロプロセッサと、前記マイクロプロセッサが実行するプログラムとしての検証ツールが格納される主記憶と、前記検証ツールを実行する前記マイクロプロセッサによってアクセスされる情報が格納される外部記憶装置とを含む情報処理システムにおいて、
手続き型プログラミング言語のプログラムコードを前記外部記憶装置から入力し、前記マイクロプロセッサが前記プログラムコードを写像および/または写像力学系に置き換える第1ステップと、
前記写像および/または写像力学系に数学的手法に基づくアルゴリズムを適用することにより、前記マイクロプロセッサが前記プログラムコードの信頼性の検証を行う第2ステップと、
を含み、
前記第1ステップでは、
前記プログラムコードを、変数宣言領域、写像処理領域、写像力学系処理領域に区別するステップと、
前記変数宣言領域では変数宣言を、識別子および当該識別子が属するデータ構造を含む数学定義へ変換するステップと、
前記写像処理領域では、条件分岐文および反復実行文を、連続微分可能写像を用いてモデル化するステップと、
前記変数宣言領域および前記写像処理領域以外の前記写像力学系処理領域では、終了条件を含む入力と出力が定義される写像を再帰的に構成するステップと、
を前記マイクロプロセッサに実行させ、
前記第2ステップにおける前記信頼性の検証では、
前記プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第1エラーレベルの検出と、
前記プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第2エラーレベルの検出と、
前記第1エラーレベルおよび前記第2エラーレベルの論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、前記プログラムコード中のカオスの存在が引き起こすプログラム動作のエラーである第3エラーレベルの検出と、
を前記マイクロプロセッサに実行させる、プログラム論理の検証方法を提供する。
本発明の第2の態様は、マイクロプロセッサと、前記マイクロプロセッサが実行するプログラム論理の検証プログラムが格納される主記憶と、前記マイクロプロセッサによってアクセスされる情報が格納される外部記憶装置と、前記マイクロプロセッサが処理する情報を可視化して表示するディスプレイと、を含む情報処理システムにおいて、
プログラム論理の検証プログラムは、
手続き型プログラミング言語のプログラムコードを写像および/または写像力学系に置き換える第1ステップと、
前記写像および/または写像力学系に数学的手法に基づくアルゴリズムを適用することにより、前記プログラムコードの信頼性の検証を行う第2ステップと、
をマイクロプロセッサに実行させ、
前記第1ステップでは、
前記プログラムコードを、変数宣言領域、写像処理領域、写像力学系処理領域に区別するステップと、
前記変数宣言領域では変数宣言を、識別子および当該識別子が属するデータ構造を含む数学定義へ変換するステップと、
前記写像処理領域では、条件分岐文および反復実行文を、連続微分可能写像を用いてモデル化するステップと、
前記変数宣言領域および前記写像処理領域以外の前記写像力学系処理領域では、終了条件を含む入力と出力が定義される写像を再帰的に構成するステップと、
を前記マイクロプロセッサに実行させ、
前記第2ステップにおける前記信頼性の検証では、
前記プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第1エラーレベルの検出と、
前記プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第2エラーレベルの検出と、
前記第1エラーレベルおよび前記第2エラーレベルの論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、前記プログラムコード中のカオスの存在が引き起こすプログラム動作のエラーである第3エラーレベルの検出と、
を前記マイクロプロセッサに実行させる、プログラム論理の検証プログラムを提供する。
一般的にソフトウェアはプログラム言語を用いて作成されている。本発明者らは、そのプログラムを部分ロジックモジュールに分割し、その部分ロジックモジュールを数式に置き換える研究を行い、置き換え技術を確立した。
さらに、そこで生成された数式の関数特性を調べ、その特性により、その部分ロジックモジュールがどのような条件の時に暴走や発散、振動を起こすかどうかを判断する技術を確立した。
この手法を用いてプログラムのロジックモジュール単体とその結合特性を調べることにより、プログラムの安定動作範囲と不安定動作範囲を検証可能とする。
すなわち、従来のテストデータチェックやロジックチェックでは検出が困難なソフトウェアの不具合(バグ)、すなわち、有限桁の浮動小数点演算が引き起こす、論理の不整合性の検証とソフトウェアが不具合を起こすパラメータそのものを与え、そのパラメータが存在することを証明できる方法を確立した。
本発明によれば、テストデータチェックやロジックチェックでは検出が困難なソフトウェアの不具合(バグ)を数学的見地から検証する方法を提供することができる。
以下、図面を参照しながら、本発明の実施の形態について詳細に説明する。
本実施の形態においては、プログラムの動作を検証するため、L.Blum,M.Shub,S.Smaleが提唱した力学系理論的定式化を導入し、プログラムの動作の力学系モデル化を行う(L.Blum,M.Shub and S.Smale,On a Theory of Computation and Complexity over the Real Numbers:NP-Copleteness, Recursive Functions and Universal Machines,Bull.Amer.Math. Soc.(N.S.)Vol.21,no.1,pp.1-46(1989).参照)。実施の形態の前半において、単一のコンピュータ上のプログラムの動作の力学系モデルを構築し、Matlab等の数値解析ツール環境上で、その力学系モデルの近似シミュレーションを行いプログラムの動作の力学系モデルによる検証の有効性について説明する。
第2章 論理関数
この章では手続きプログラム言語中に現われるif文、switch文、while文の分岐条件の論理演算の数学モデルを与えるのに必要な論理演算のためのBoolean関数を定義し、その性質をまとめる。
2.1 Boolean関数の定義
Z:整数 R:実数
Bo:Boolean Bo={0,1}⊂Z⊂R
0のとき、偽(False),1のとき、真(True)となる。
全てのe∈Boに対して、Not(ex)=1−ex
任意のex,eyに対して、exANDey=ex・ey
任意のex,ey∈Boに対して、exORey=1−(1−ex)・(1−ey)
各論理演算の真理表を図2に示す。このNot,AND,ORの論理演算を複数組み合わせた一般的なBoolean関数を以下のように定義できる。なお、一般的なBoolean関数については、たとえば、木村正行、水野尚,しきい値論理とその応用,昭晃堂、1979年、等の文献に記載されている。
Bon:Boのn個の直積、e=(e,e,...,e),e∈Bo,k=1,...,nとおく。n変数の論理関数flogic:Bon→Boをflogic(e,e,...,e)または、flogic(e)と記述する。
また、e(バー)=1−eとおく。さらに、eivをBonの任意に与えられた点として、点eivにおいてのみ1をとり、その他の点では、0をとるn変数の論理関数をflogic(i)で表す。このとき、flogic(i):=e ....e と与えられる。ここに、
このとき、flogic(e,e,...,e)は次のように展開できる。
上の展開は、任意の変数e,k=1,...,nについても同様に成立する。この展開とeiv、flogic(i)を用いて、flogic(e,e,...,e)は一般的に次の形に表すことができる。
以上より、flogic(e,e,...,e)はn変数の多項式で記述されることがわかる。
2.2 条件分岐に用いる論理関数の Boolean関数表現
上のBoolean関数の定義をif,switch,while文などの条件分岐に用いる代表的な論理関数に適用して、以下のようなBoolean関数として与える。
第3章 浮動小数点
この章では、コンピュータの演算で使用される浮動小数点についてまとめる。特に、一般的に用いられるIEEE754フォーマットを中心に取り上げ、有限桁の浮動小数点演算における問題についても触れる。
3.1 IEEE754フォーマット
IEEEは米国電気電子技術者協会(The Institute of Electrical and Electronics Engineers)のことを指し、アメリカに本部があって世界中に会員がいる大きな学会である。コンピュータ関係の規格も作成しており、IEEEが作成した規格が国際規格に採用されることも多い。754というのは、IEEEの中のワーキンググループの番号で、規格の番号でもある。IEEE754は浮動小数点演算の規格である。昔は浮動小数点数のデータ形式はコンピュータによってバラバラであり、データをやりとりするときに変換処理が必要になり、とても不便であった。そのため、コンピュータの技術者が集まり共通のデータ形式と計算方法を決定した。その時作成されたのがIEEE754規格である。一つの浮動小数点数を32ビットまたは64ビットで表現する。32ビットを単精度(Single Precision)と呼び、64ビットを倍精度(Double Precision)と呼ぶ。これらの拡張形式を実装するように推奨し、相互運用や演算規則などが規定されている。
IEEE754では、ビットの使い方として、符号(sign)/指数(exponent)/仮数(mantissa)を次のように定義している。有為な数を仮数と呼び、残りのビットは指数部、符号ビットとする。32ビット表現を単精度と呼び、符号ビットを1ビット、仮数部を23ビット、指数部を8ビットとする。64ビット表現を倍精度と呼び、符号ビットを1ビット、仮数部を52ビット、指数部を11ビットとする。2進数を使うため、ほとんどの10進数の小数は正確に表現できない。
IEEE754のビット表現について説明する。
単精度のビットパターンによる表現
単精度のIEEE754浮動小数点数は、符号ビット(1ビット)、指数部(8ビット)、仮数部(23ビット)の32ビットで表現される。
指数(exponent)
指数部は2の0乗のときは、01111111となる。
指数部の2進数表現
1000 0011 +4乗
1000 0010 +3乗
1000 0001 +2乗
1000 0000 +1乗
0111 1111 0乗
0111 1110 −1乗
0111 1101 −2乗
0111 1100 −3乗
仮数(mantissa)
仮数部は2を基数として整数部が一桁になるように正規化した数の2進数表現になる。正規化によって仮数部の最上位ビットは常に1になるので、実際に用意しておく必要はなく、倍精度の52ビットであれば、最上位の1をhidden bitにして含めなければ、53ビット分の情報が含まれることになる。
小数の2進数表現
0.1000 1/2 =0.5
0.0100 1/(2*2) =0.25
0.0010 1/(2*2*2) =0.125
0.0001 1/(2*2*2*2*)=0.0625
符号(sign)
符号ビットは1ビットで、1は負の数、0は正の数を表す。代表的な10進数表現の差異のビットパターンを、図3に示す。
3.2 有限桁の浮動小数点演算と論理演算の問題
R:実数の集合、Mf:IEEE754のフォーマットの単精度の浮動小数点の集合、Md:IEEE754のフォーマットの倍精度の浮動小数点の集合とする。任意のa,b>0,a,b∈Rに対して、論理的に、a+b>aが成立する。しかしながら、任意のa,b>0,a,b∈Mf、またはa,b>0,a,b∈Mdに対して、a+b=aとなるbが存在する。IEEE754のフォーマットに限らず、有限桁の浮動小数点演算では同様なことが発生し、ある桁幅を超えた数どうしの四則演算は成立しない。これらの現象は桁落ち、情報落ちと呼ばれる。if文などの分岐条件がこのような桁落ち、情報落ちの影響を受けた場合、プログラマの意図しない動作を引き起こす原因となる。この節では、Mdの浮動小数点の演算を対象として、a,b>0,a,b∈Mdに対して、a+b=aとなるbが存在する例をMatlabを用いて示す。その実行結果が図4である。
上記の(1+2−52>1),(2+2−52>2),(2+2−52==2)はそれぞれ2章の代表的な論理関数であり、それぞれのansの値はBo値を示している。したがって、その結果は、(1+2−52>1)=1,(2+2−52>2)=0,(2+2−52==2)=1となっており、1+2−52>1は真であるが、2+2−52>2は偽であり、2+2−52==2が真となっており、2−52がa,b>0,a,b2∈Mdに対して、2+b=2となるbの解2−52になることを示している。次に、このような結果が起きる理由をさらに詳しく調査する。
hex2bin(num2str(x,“%bx”))の浮動小数点xをIEEE754のビットパターン表現に変換するMatlabの関数(本実施の形態の説明の末尾に記載された(付記)に例示された関数プログラムを参照)を用いて以下に、1,1+2−52,2,2+2−52のIEEE754のビットパターン表現をMatlabによって得た結果を、図5に示す。
1と1+2−52のIEEE754のビットパターン表現は最後の1が異なり、加算が行われていることがわかる。しかし、2と(2+2−52)のIEEE754のビットパターン表現は全く同一であり、加算が成立せず、情報落ちが発生していることがわかる。上の極めて簡単な例からでも、このような桁落ち、情報落ちの影響が、プログラマの意図しない動作を引き起こす原因となることが容易に理解できる。
第4章 プログラミング数学モデル
4.1 条件分岐に用いる論理関数の連続変形型の Boolean関数表現
上述の第2章のBooleanBoを連続変形型のBoolean:Bh=[0,1]に拡張して、if,switch,while文などの条件分岐に用いる代表的な論理関数を連続変形型の論理関数に拡張する。
今、連続変形型のBoolean:Bh=[0,1]と連続変形型の論理関数を定義するため、BooleanBo={0,1}の領域を:Bh=[0,1]⊃Boに埋め込む。
このとき、区間[0,1]:={x∈R|0≦x≦1}とおく。連続変形型の論理関数は、それぞれ、以下の式5、式6、式7ように定義する。
通常の論理関数を、連続変形型の論理関数と置き換えることにより、論理関数を微分可能な関数に変形可能である。さらに、連続変形型の論理関数の導関数を以下の式8、式9、式10ように定義する。図6、図7、図8、図9にそれぞれの連続変形型の論理関数とその導関数の例を示す。
4.2 連続変形型の Boolean関数表現の応用
3章において、有限桁の浮動小数点演算と論理演算の問題に触れたが、ここでは、連続変形型のBoolean関数表現を用いて、有限桁の浮動小数点演算において、論理演算が成立しない場合の浮動小数点を求める方法について述べる。2章では、一般的な論理関数flogic(e,e,...,e)はn変数の多項式で記述されることを示した。flogic(e,e,...,e)=1,またはflogic(e,e,...,e)=0のどちらかであり、このどちらかが成立する(e,e,...,e)の値を求めるには、これらのn変数の多項式の方程式の解を求めれば良い。if文、switch文、while文の分岐条件は、flogic(e,e,...,e)で与えられ、一般的に、e,k=1,2,...,nは、例えばe(x{k1,x{k1,...,x{km)=(xk1>ak1)+(xk2>ak2)+...+(xkm>akm),xkj,akj2Md,j=1,2,...,mのように、有限桁の浮動小数点を入力変数(x{k1,x{k1,...,x{km)とするそれぞれのBoolean型論理関数の多項式で与えられる。
したがって、有限桁の浮動小数点を入力変数とするBoolean型論理関数の多項式の方程式の解を求める問題に帰着するが、このBoolean型論理関数の多項式の方程式は微分可能ではないので、ニュートン法などの通常の数値解析の方法を用いることができない。
そのため、前節で定義した連続変形型のBoolean関数表現を用いて、β=1とした場合の微分可能な近似Boolean型論理関数の多項式の方程式の良い近似解(β≠0)を求め(このとき、連続変形型のBoolean関数の他のパラメータγ,δなどは、適切になるように決め、β=1からだんだんβの値を小さくしながら、繰り返し近似解を求める。)、十分良い近似解が求まった後で、その解をβ=0の場合のBoolean型論理関数の多項式に代入して、その方程式の解であるかを確認する手法を本実施の形態では提案する。
以下に、(10+x>10)==0となるx∈Mdを求める例を示す。この場合、式(6)からlogicp(10+x,β,10,γ,δ)==0,β=[0,1]の連続変形型のBoolean関数方程式を用いる。このとき、logicp(10+x,β,10,γ,δ)の導関数(式(11))は、式(9)によって与えられる。そして、次の式(12)で関数を定義する。
あるβ≠0,かつ十分小さなdelta0(>0)∈Mdに対して、|g(x,β,10,γ,δ)|<delta0が成立するxが近似解となる。
以下の図10に、(初期値x0=2−38,β=1,γ=1=2,δ=250)のパラメータに対して、Matlabによって得た結果を示す。
上記のように、関数g(・・・)は収束し、4回繰り返して得られた近似解x=3:634426093412913・・・10−12を(10+x>10)に代入した結果は、(10+x>10)=0となり、x=3:634426093412913・・・10−12が(10+x>10)=0の解であることを数値的に証明できる。
4.3 変数の表記方法
1.変数の時間的発展
コンピュータに行わせる作業の「手順」の記述に重きを置いた言語(手続き型プログラム言語)では、各処理の時間的発展はソース記述順の上から下へと流れる。このプログラム上の変数xの時間的発展を、添え字nを導入して表すことにする。ただし、プログラム言語の仕様によっては、関数の中で変数を宣言することができるが、その場合、変数のスコープ(有効範囲)はその関数の中に限定される。変数の時間的発展は、各変数のスコープごとに固有であると考えられるため、先の添え字nを、スコープが識別できるように、n−scopeと表す。
例えば変数xが関数fで宣言されており、その時点での時間的発展が3である場合。scopeを−x−fなどと表記することにして、x3−x−fと表す。

3.操作回数
ある変数xに対して代入文が記述されているとき、実際のプログラム実行時にこの処理が行われるときには、その変数xに対して代入文で定義された操作が行なわれることになる。変xに対し、1つの代入文が定義されていれば、その変数の時間的発展は+1されるとみなす。つまり、関数fで宣言されている変数xに対する1回の操作sは、x(n+1)−x−f=s(xn−x−f)、と表す。
4.実引数を「どのように」仮引数に渡すか
関数を使用する際に、「関数に引き渡す変数」を実引数(argument)といい、関数定義時に使用される変数を仮引数(parameter)といい、区別する。
4.4実引数と仮引数(C言語の例)
図11は、仮引数で呼び出されるC言語のプログラム例を示している。
関数を呼び出すとき、プログラム言語の仕様によっては、実引数が「左辺値」として評価し得る式であるときに、左辺値を渡す(call−by−reference)のか、右辺値を渡す(call−by−value)のかを任意に選択できる。
ここで、左辺値とは代入が許される(代入式の左辺になりうる)値のことであり、右辺値とは代入式の右辺になりうる、参照のみ許された値のことである。
次の図12に例示されるプログラム例のように、実引数として左辺値が渡されるとき、関数内で仮引数に対して操作を行なうということは、呼び出し元で実引数となった変数に対して操作を行うことと等しい。
4.5 if,elseif,switch,for,while文の表記方法
ここでif,elseif,switch文のような条件分岐やfor,while文などのループ(反復実行文)についてモデル化を提案する。
if,elseif,switch文の一般的な操作とループのブレーク条件を代表させるため、
X=(x1,x2,・・・,xn)∈Rn,x∈R
fk:Rn→Rを連続微分可能写像とし、F:Rn→RnをF=(f1(X),f2(X),...,fn(X))Tのような連続微分可能ベクトル写像とする。
また、if,elseif,switch,for,while文などの分岐条件、終了条件の変数をe∈Bとし、eがプログラム内の変数の関数の場合、e=ef(x)とおく。
さらに、h:Rn→Rをh(X)=0,X∈Rnの解が存在するある実関数とする。このとき、全微分dfk(β,X),dF(β,X)=DF(β,X)dX,<dh(X),dX>=0が存在する。ここに、DF(β,X)はヤコビアンを、(・・・)Tはベクトルの転置を<,>は内積をそれぞれ表す。
以下において、fk(X)とh(x)=0はそれぞれ、if,elseif,switch文の操作とwhile文のループのブレーク条件を表すことにする。
また、if,elseif,switch文の条件分岐変数とwhile文のループのブレーク条件変:e(β,X)を連続変形型のBoolean:Bh=[0,1]関数とおき、β=1の時、微分可能な関数に変形し、β=0の時、Bo={0,1}の微分不可能な変形するβをパラメータとする連続変形関数とおく。したがって、de(1,X)となる全微分が存在する。
図13は、if文を含むプログラム例であり、それに対応する写像の例が、次の式(13)である。
同様に、図14は、elseif文のプログラム例であり、それに対応する写像の例が、次の式(13)である。
同様に、図15は、switch文のプログラム例であり、それに対応する写像の例が、次の式(15)である。
同様に、図16は、for文のプログラム例であり、それに対応する写像の例が、次の式(16)である。
同様に、図17は、for文のプログラム例であり、それに対応する写像の例が、次の式(17)である。
上記のように、if文、elseif文、switch文、for文は、写像、合成写像によって、簡単にモデル化できる。一方、while文は、初期値X0を持つ離散写像力学系Fn(X0)の軌道{X0,X1,X2,...,}を求め、h(n)=h(Xn)=h(Fn(X0))=0$を満たすnを未知変数とする関数方程式としてモデル化されることに注目されたい。
このモデル化を用いて、プログラム中のif文、elseif文、switch文、for文の分岐条件が、プログラマの意図どおりになっているか、検証することができる。
本実施の形態の場合には、以下の3種類のエラーを検出することによって、プログラムコードの信頼性の検証を行う。
a)エラーレベル1「プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラー」の検出。
b)エラーレベル2「プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラー」の検出。
c)エラーレベル3「エラーレベル1とエラーレベル2の論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、プログラムコード中のカオスの存在が引き起こすプログラム動作のエラー」の検出。
各変数の増減の変化と極値の推定:上の全微分dyl(X),dy(X)について、dyl(X)=0,dy(X)=0となるXが極値の条件であるので、これを解いて、極値を求め、極値を含みかつ|dyl(X)|<ε,|dy(X)|<εとなる範囲をプログラムコードの動作試験用の入力パラメータ範囲とする(εの大きさはユーザーが決定する)。
全微分dFn(Fn(X))dXについてはdFn(Fn(X))dX=(df1(X),...,dfn(X),)Tとなっているので、各成分dfk(X),k=1,...,nについて、dfk(X)=0,k=1,...,nとなるXが極値の条件であるので、これを解いて、極値を求め、極値を含みかつ|dfk(X)|<εとなる範囲をプログラムコードの動作試験用の入力パラメータ範囲とする(εの大きさはユーザーが決定する)。
エラーレベル1の検証:
if文のe(β,X),k=1,...,lが全て相異なっているかチェックする。ひとつでも同じであれば、エラーレベル1の警告を出力する(エラーレベル1とは限らない)。
elseif文の=Σ k=1(β,X)=1を満足するかチェックする。満足しなければ、エラーレベル1が発生する。
switch文のlogicd(x,β,ak,σ)のakが全て相異なっているかチェックする。ひとつでも同じであれば、エラーレベル1の警告を出力する(エラーレベル1とは限らない)。
エラーレベル2の検証:
Step1:yl(X),y(X),Fn(X)を有限桁の浮動小数点演算(Matlab,JAVA(登録商標),C++(登録商標)など)と有理数演算(Maple(登録商標),Mathematica(登録商標))で求めて比較する。異なっていれば、エラーレベル2が発生している。
Step2:(無限桁の論理演算と有限桁の論理演算関係が一致しない有限桁の数値の探索)β=1:対象とする写像の無限桁の論理演算の関係が不整合となる有限桁浮動小数点の数値の近似解を求めて、β=1からβ=0にだんだん近づけて、無限桁の論理演算が不整合となる有限桁浮動小数点の数値を確定する。
エラーレベル3の検証:
while文の写像Fn(β,X)の1変数をフラクタル次元解析にかけて、カオス性、フラクタル性の検証を行うフラクタル次元が非整数となった場合、エラーレベル3が発生している。
第5章 Matlabソースコードの力学系モデル
ここでは、前章の数学モデルを用いて、上述の図1の二分法のプログラムを書き換えることにする。ただし、Matlab上でこの書き換えの近似シミュレーションが行えるように、Matlabが処理できない写像、関数フォーマットは、Matlabの文法のままとする。
図18は、書き換えた結果の写像処理領域を示している。この場合、図1の行番号1、2、3、4、6、7の行の変換結果が、図18の行番号4、5、6、8、20、21に対応している。また、図1の行番号8−14の行の変換結果が、図18の行番号22に対応している。
図19は、書き換えた結果の写像力学系処理領域を示している。この場合、図18の写像領域に配置される関数bwds()のコード等が置かれている。
上記において、元のMatlabの二分法プログラムのwhileループ内を離散力学系を含む写像bwds(a,b,i,delta0)として取り出し、whileループがない、写像(または関数)処理領域と離散写像力学系を含む写像力学系処理領域に分けて記述し、写像処理領域FR1で写像力学系処理領域SR1のwhileのbwds(a,b,i,delta0)を呼び出して使用する。if文やwhile文の分岐条件のBoolean変数は、更新番号をつけないこととする。そして、プログラムの実行が開始されてから、終了するまでの写像処理領域と写像力学系処理領域のプログラムの各変数の更新回数は、その変数名の配列の個数で与えられ、要素番号が、更新回数を表し、そのときの要素番号の配列の内容がそのときの変数の状態を与えるようになっている。ただし、Matlabの配列は、C言語やJAVA言語と異なり、1番からしか定義できないため、数学的モデル化の定義と1番づつずれている。
6 Matlabコードの力学系モデルの近似シミュレーション
以下において、上述の図18、図19のMatlabコードの力学系モデルを用いて、a(1)=2:5,b(1)=1.1、delata0=10−2,として、f(x)=x−2=0の解を求めるときのプログラムの各変数の動きを近似シミュレーションで求める。
本実施の形態の末尾に、そのシミュレーション結果([シミュレーション開始]〜[シミュレーション終了]のでのリスト)と、実行に用いられたMatlabのプログラムのリストを示す。
すなわち、後述の(付記)に示したシミュレーション結果は、シミュレーション実行時における画面へのテキスト出力のリストである。
以下のMatlab上のシミュレーション結果において、プログラムの実行が開始されてから、終了するまでの写像処理領域と写像力学系処理領域のプログラムの各変数の更新回数は、その変数名の配列の個数で与えられ、要素番号が、更新回数を表し、そのときの要素番号の配列の内容がそのときの変数の状態を与えている。したがって、このMatlabコードの力学系モデルの有効性を確認できた。
以下、図面を参照して、上述の原理を用いた本実施の形態のプログラム論理の検証方法を実施するプログラム論理の検証プログラム(検証ツール)の一例についてより具体的に説明する。
図20は、本実施の形態のプログラム論理の検証方法、プログラム論理の検証プログラムが実施される情報処理システムの構成例を示すブロック図である。
図21、図22、図23、図24は、本実施の形態の検証ツールの作用の一例を示すフローチャートである。
図20に例示されるように、本実施の形態の情報処理システム200は、一例として、マイクロプロセッサ(MPU)201、主記憶202、外部記憶装置203、ディスプレイ204、キーボード205、ネットワークインタフェース206を含むコンピュータからなる。
MPU201は、主記憶202に格納されたソフトウェアを実行することで、情報処理システム200の全体を制御する。
主記憶202は、MPU201が実行するソフトウェアやデータが格納される。本実施の形態の場合、主記憶202には、たとえば、基本ソフトウェアであるオペレーティングシステム301、このオペレーティングシステム301の制御の下で稼働する検証ツール302、言語処理系303が実装されている。
オペレーティングシステム301は、MPU201によって実行されることで情報処理システム200の全体を制御する。
言語処理系303は、情報処理システム200において、所望のプログラム言語によるソフトウェアの開発環境を提供するものであり、ソースコードの編集を行うソースエディタ、さらにはコンパイラ、インタプリタ、等のソフトウェアツール群で構成されている。
検証ツール302は、上述のような数学的な手法によって、言語処理系303におけるソフトウェアの開発過程において、プログラムのソースコードの検証を行う機能を提供する。
外部記憶装置203には、言語処理系303で開発されるソースコード401、検証ツール302が出力する情報が格納される判定結果ファイル402およびログファイル403が格納される。
ディスプレイ204は、情報処理システム200のユーザに情報を可視化して表示する。
キーボード205は、ユーザが情報処理システム200に情報を入力するために用いられる。
ネットワークインタフェース206は、情報処理システム200を外部のシステムと図示しない情報ネットワークを介して接続する機能を有する。したがって、外部記憶装置203に格納された情報は、情報ネットワークを介して外部の情報処理装置のものを用いることもできる。
あるいは、ネットワークインタフェース206を介した外部から情報処理システム200への遠隔アクセスにより、検証ツール302や言語処理系303の機能を外部から遠隔操作で利用することもできる。
次に図21〜図24のフローチャートを参照して、本実施の形態の検証ツール302の機能を説明する。
まず、本実施の形態の検証ツール302では、以下のように定義される情報が用いられる。
変数宣言:コード内の変数宣言を行う。(例: double x; , int i;など)
写像処理:while文、do〜 while文、回数指定のないfor文を使用しない。If文、elseif文、switch文、回数指定のあるfor文を含む処理である。
写像力学系処理:while文、do〜 while文、回数指定のないfor文に囲まれた処理である。この中に、If文、elseif文、switch文、回数指定のあるfor文を含む処理も含む。
検証ツール302は、ソースコード401を入力し(ステップ101)、ソースコード401を複数の領域に分類し(ステップ102)、各領域毎に数学モデルへの変換処理を実行し(ステップ103)、導関数の応用による推定処理を実行して(ステップ104)、後述の判定処理のための支援データを出力する。
上述のステップ102では、ソースコード401を、変数宣言の領域1−1、写像処理領域1−2、写像力学系領域1−3に分類する。このとき、写像力学系領域1−3を、再帰的に、変数宣言の領域1−1、写像処理領域1−2、写像力学系領域1−3に分類し、変数宣言の領域1−1と写像処理領域1−2の領域だけになるまで繰り返し分類する。
上述のステップ103は、以下のステップ2−1、ステップ2−2、ステップ2−3を含んでいる。
ステップ2−1:変数宣言の領域1−1は、変数宣言の変換を用いて数学定義に置き換える。
ステップ2−2:写像処理領域1−2は、if文、elseif文、switch文、回数指定のあるfor文のそれぞれの変換を用いて数学モデルに置き換える。そして、写像処理領域1−2に含まれる写像力学系領域1−3を写像処理領域1−2の領域で呼び出して使用する入力と出力が定義される。また、写像力学系領域1−3で定義される写像または関数に置き換える。
ステップ2−3:写像力学系領域1−3は、while文、do〜while文、回数指定のないfor文の変換を用いて数学モデルに置き換える。そして、while文、do〜while文、回数指定のないfor文の終了条件変数を含む入力と出力が定義される写像または関数を定義する。さらに、写像力学系領域1−3に含まれる変数宣言の領域1−1と写像処理領域1−2は、それぞれ、上述のステップ2−1とステップ2−2の処理を行う。
上述のステップ104では、上述の式(13)〜式(17)の数学モデルの導関数において、β=1として、プログラムコード(ソースコード401)への入力パラメータの増減の変化に対する、プログラムコードの各変数の増減の変化と極値の推定を行う。
上述のステップ105では、ステップ104の推定結果に基づいて、プログラムコードの動作試験用の入力パラメータ範囲(式(13)〜式(17)の数学モデルのパラメータ)の決定の支援データ(後述の図30に例示される解析する識別子、時間的発展、数式、位置情報、等)をログファイル403等に出力する。
こうして得られた支援データに基づいて、以下のようにして、上述のエラーレベル1〜3の各エラーレベルの検証処理が行われる。
すなわち、エラーレベル1の検証は、図22に例示されるフローチャートの処理にて行われる。
まず、ログファイル403に上述のようにして格納されている支援データから、動作試験用のパラメータ範囲を読み込む(ステップ111)。
次に、β=0に設定し、プログラムコードのif文、elseif文、switch文、回数指定のあるfor文の条件分岐変数関数とwhile文、do〜while文、回数指定のないfor文の停止条件変数関数の無限桁の論理演算の整合性の検証を行う(ステップ112)。
そして、無限桁の論理演算の整合性はOKか判別し(ステップ113)、不整合と判定された場合には、エラーレベル1の発生とみなして、プログラムコードの内の不整合のある条件分岐変数関数と停止条件変数関数とその分岐変数関数を含む元のソースコードの行番号とその行のコードを判定結果ファイル402に出力する(ステップ114)。また、ステップ113で整合性がOKと判定された場合には、エラーレベル1のクリアを判定結果ファイル402に出力する(ステップ115)。
また、エラーレベル2の検証は、図23に例示されるフローチャートの処理にて行われる。
まず、ログファイル403に上述のようにして格納されている支援データから、動作試験用のパラメータ範囲を読み込む(ステップ121)。
次に、β=0に設定し、プログラムコードの各変数、特にプログラムコードのif文、elseif文、switch文、回数指定のあるfor文の条件分岐変数とwhile文、do〜while文、回数指定のないfor文の停止条件変数関数の無限桁の論理演算の関係と有限桁の浮動小数点演算を含む論理演算の関係との比較検証を行う(ステップ122)。
そして、無限桁の論理演算と有限桁の論理演算の関係は一致するか判別し(ステップ123)、一致する場合には、エラー無しとしてエラーレベル2のクリアを判定結果ファイル402に出力して終了する(ステップ124)。
ステップ123で不一致と判定された場合には、さらに、無限桁の論理演算と有限桁の論理演算関係が一致しない有限桁の数値の探索を行うか否かを判別し(ステップ125)、行わない場合には、プログラムコードの内の不整合のある条件分岐変数関数と停止条件変数関数とその分岐変数関数を含む元のソースコードの行番号とその行のコードを判定結果ファイル402に出力して(ステップ126)、終了する。
ステップ125で探索を行うと判定され場合には、さらに、プログラムコードの動作試験用の入力パラメータ範囲を入力するとともに、対象とする、無限桁と有限桁論理演算が不整合となる論理関係を設定する(ステップ127)。
そして、β=1に設定し、対象とする無限桁の論理演算の関係が不整合となる有限桁浮動小数点の数値の近似解を求めて、β=1からβ=0にだんだん近づけて、無限桁の論理演算が不整合となる有限桁浮動小数点の数値を確定する(ステップ128)。
そして、エラーレベル2が発生する無限桁の論理演算が不整合となる有限桁浮動小数点の数値を判定結果ファイル402に出力して(ステップ129)、終了する。
また、エラーレベル3の検証は、図24に例示されるフローチャートの処理にて行われる。
まず、ログファイル403に上述のようにして格納されている支援データから、動作試験用のパラメータ範囲を読み込む(ステップ131)。
次に、写像力学系処理内の最も更新番号が多くなる1変数をフラクタル次元解析にかけて、カオス性、フラクタル性の検証を行う(ステップ132)。
そして、フラクタル次元は整数か否かを判別し(ステップ133)、整数でない場合には、エラーレベル3の発生とみなして、プログラムコードの内の写像力学系処理内でフラクタル次元が非整数となる元のソースコードの行番号とその行のコードを判定結果ファイル402に出力して(ステップ135)、終了する。
ステップ133で整数と判定された場合には、エラーレベル3のクリアを判定結果ファイル402に出力して(ステップ134)、終了する。
以下、本実施の形態の検証ツール302の実際の運用の流れを説明する。
まず、ユーザは、コンパイル可能なプログラムソース(テキストファイル)を入力する。
情報処理システム200の検証ツール302は、プログラムソースを可数学モデル化プログラムソースに変換する。
なお、可数学モデル化プログラムソースとは、以下のような特徴をもつ。
a) if文などの条件式の「条件判定式」が、
<固有の識別子>=<条件式>;
の形でif文の前に定義されており、条件判定はこの識別子の値で行われる。
b)繰り返し回数が不定な繰り返し文(繰り返しの条件判定が常に真。または、繰り返し制御中に、繰り返し条件判定とは別の条件により繰り返しの制御を脱出する文)は、関数として定義されている。
c)プログラムソースは、上述のように以下の領域に分類されている。
i)変数宣言の領域
ii)写像処理領域
iii)写像力学系領域
これらの特徴を備えた可数学モデル化プログラムソースは、通常のプログラム文法で作成可能である。
ユーザは、予め可数学モデル化プログラムソースとして、プログラムをコーディングすることも可能である。
予め可数学モデル化プログラムソースとして、プログラムをコーディングしている場合は、この変換ステップは不要である。
検証ツール302は、可数学モデル化プログラムソースに対応する数学モデルを、以下のような手順で算出する。
a)可数学モデル化プログラムソースを全精査し、定義文を抽出する。
b)以下の情報を定義文ごとに、自動的に算出する。
定義義文とは、単純な形では、代入文として現れる。ここでいう定義文とは、if文などの条件文や、while文などの繰り返し文などの制御を考慮した「代入文」のことである。
図25A、図25B、図25Cは、本実施の形態の検証ツール302にて用いられる定義文の一例を示す概念図である。
この図25A、図25B、図25Cに例示される定義文において、識別子は、プログラム中では、変数を識別するためにされる。
また、定義文における時間的発展は、手続き型言語で記述された、同一識別子の変数に対して、定義文が記述されているとき、この変数は時間的発展をするとみなし、添え字をインクリメントする。この時間的発展は、数式の形で出力する。
また、定義文における数式は、数式モデルとして出力される。
また、オリジナルの位置情報は、数式モデル変換前の識別子の位置情報(行、列)である。
上述の可数学モデル化プログラムソースの変換処理において数学モデルが算出されていれば、ユーザは、オリジナルのプログラムソース、中間的な可数学モデル化プログラムソース、数学モデルの3つのテキストデータを並べて見ることができる。
図26は、ディスプレイ204に表示されるモデル表示画面501を示している。モデル表示画面501は、プログラムソースが表示されるオリジナル領域502、可数学モデル化プログラムソースが表示される中間領域503、数学モデルのリストが表示される解析結果領域504からなる。
このうち重要なのは、オリジナルのプログラムソースと数学モデルであるので、可数学モデル化プログラムソースの中間領域503は、必ずしも表示する必要はない。
検証ツール302に対し、ユーザは以下のような操作が可能である。
a)エラーレベル1「プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラー」の検出
例えば、ユーザは任意の条件文を選択し、排他条件になっているかを確認できる。
i) if 条件式1 elseif条件式2 elseif 条件式3 ・・・というプログラムがある場合、各条件式は排他な関係であることが好ましい。
ii) ユーザは、数学モデルのリストのうち、検証したい条件式(の識別子)を選択する。
iii) システムはユーザが選択した条件式の論理和を求め、1以下となればOK。1を超える場合NGとし、エラーメッセージを出力する。
たとえば、図27に例示されるC言語のプログラムはコンパイル可能だが、実行すると無限ループしてしまう。
10行目のif文の条件式a>3 と12行目のif文の条件式 a==5の数学モデルを検証すれば、この条件が排他ではないことが分かる。
b)エラーレベル2「プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラー」の検出
例えば、ユーザは任意の変数を選択し、無限桁演算の場合と有限桁演算の場合を比較することができる。
i)ユーザは、数学モデルのリストのうち、検証したい変数(の識別子)を選択する。
ii)ユーザは、有限桁演算の規格、例えばIEEE754を選択する。
iii)システムは、i)で選択した変数の数学モデルについて、無限桁演算の場合とii)で選択した有限桁演算の場合とをグラフ化し、重ね合わせて表示する。また、有限桁演算のグラフの変極点を算出して表示する。
図28に例示されるC言語のプログラムはコンパイル可能で、10行目のcの演算について、無限桁演算ならば問題がないが、有限桁演算を考えると、intには2147483647〜−2147483648までの値しか格納できないため、a+bが2147483647または−2147483648に近づく場合、正しい計算結果にならない。
10行目のcの演算を行う数学モデルを、無限桁演算の場合と有限桁演算の場合で比較することにより、ア)〜ウ)の利点がある。
ア)変極点から、通常のソフトウェアテストで重点的に検証する必要があるポイントを確認できる。
イ)どういう入力のとき、無限桁計算と同じ結果にならないことがあるか確認できる。
ウ)中点を求める数学モデルを、c=(a+b)/2ではなく、c=a−(b−a)/2、とする、などの発想の足がかりとなる。
c)エラーレベル3「エラーレベル1とエラーレベル2の論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、プログラムコード中のカオスの存在が引き起こすプログラム動作のエラー」の検出
上述のように、検証ツール302では、プログラムソースは以下の領域に分類されて処理される。
i)変数宣言の領域
ii)写像処理領域
iii)写像力学系領域
このうち、写像力学系領域において、カオスが発生する可能性がある。
ユーザは、数学モデルのリストのうち、任意の写像力学系領域を表す関数(の識別子)を選択することができる。
検証ツール302は、選択された写像力学系領域について、カオスが発生する可能性があるか検証し、解析結果としてメッセージを出力する。
以下に、図29に例示されるC言語のプログラムを解析する場合の識別子、時間的発展、数式、位置情報等の支援データの出力の推移を、図30の出力例に示す。
図30のように出力される情報は、ログファイル403に記録され、モデル表示画面501のオリジナル領域502、中間領域503、解析結果領域504に表示されるとともに、必要に応じて、上述の図22、図23、図24のフローチャートに例示したエラーレベル1、エラーレベル2、エラーレベル3の判定に用いられる。
この図30の出力結果の生成過程について例示すると、以下のようになる。
[変数の時間的発展について]
プログラムに登場する変数は、代入文によってその値を定義される。つまり、プログラムソースにおける「変数=式」で表現される数式は、問題を解くべき数式ではなく、その変数を特徴づける定義式である。
定義式が与えられるたび、刻々と変化していく変数をモデル化し、管理するために、上述のように各変数の識別子に添え字を導入している。
時間的発展の増加幅は、定義文が与えられるたびに+1と定める。
各変数の時間的発展は、各変数ごとに固有であることに注意する。
各変数の時間的発展は、スコープごとに定義し、宣言されただけで、まだ一度も定義が与えられていない場合の添え字を0とし、以降インクリメントしていく。
なお、添え字が0である変数の実際の値は、プログラミング言語に依存し、javaでは変数型によって固有の値が与えられるが、C言語の場合は不定(メモリ状態に依存する)。不定な状態は、Norator(ノレータ)と表記する。
実際のプログラムにおいて、定義式が与えられるかは、制御構造に依存するケースがある。
分岐のない、直線形のプログラムの場合、図31に例示されるように添え字が変化する。この場合の数学モデルは、単純に時間的発展は+1されるので、たとえば、an+1=X;となる。
分岐のあるプログラムの場合には、図32に例示されるように添え字が変化する。この場合の数学モデルは、単純に時間的発展は+1されないので、たとえば、an−1・e=X・e+a(1−e):、などとなり、実際のaの値だけではなく、時間的発展がされるかどうかも条件式eに依存する。
一般的には、
if(e1){
a=X;
}else if(e2){
a=X;
} else if(e3){
a=X;
:
などとあった場合、
n+1・e1+1・e2+1・e3=X・e1+X・e2+X・e3+...
となる。
[写像力学系領域]
写像力学系領域の場合には、図33に例示されるように添え字が変化する。写像力学系領域Fは、独立した関数として扱う。
Fの作用により、aが定義されるということは、Fの戻り値によってaが定義されている場合が考えられる。この場合の数学モデルは、単純に時間的発展は+1されると考えて、an+1=F;、となる。
以上説明したように、本実施の形態のプログラム論理の検証方法、プログラム論理の検証プログラムによれば、従来のテストデータチェックやロジックチェックでは検出が困難なソフトウェアの不具合(バグ)を数学的見地から検証することが可能になる。
すなわち、本実施の形態の検証ツール302を使って、プログラムソースを数学モデルに変換することにより、従来にない視点でソフトウェアの信頼性を検証することが可能となる。
すなわち、従来、数学モデルを用いてアルゴリズムを考案したり、アルゴリズムの計算量を数学モデルを用いて算出することはあったが、本実施の形態のように、プログラムソース全体を数学モデルに変換する試みはなかった。
コンピュータの歴史より、数学の歴史の方がはるかに長いため、問題解決のためのさまざまな環境が整っており、正しさを「証明」するには数学の世界の方が有利である。証明の概念自体が数学の概念なので、プログラムの正しさの証明が確実である。
プログラムソースを変換して得た数学モデルと、プログラムの作成仕様書のもととなった数学モデルを比較することで、間違いに気が付いたり、新しい数学モデル、新しいアルゴリズムを考案するきっかけになりうる。
つまり、従来のソフトウェアテストが仕様書を出発点にしていたのに対し、より高次の検証も可能となる。
この結果、すべてのコンピュータ上で利用されるソフトウェアの品質向上と動作保障を調査、検証する技術の提供を実現できる。
ソフトウェアを利用するすべての産業が対象となり、世界規模の市場での広範な利用が見込める。さらに今まで開発されたソフトウェア資産とこれから開発される新規ソフトウェアすべてが適用範囲となり、本発明の市場価値は計り知れない。
なお、本発明は、上述の実施の形態に例示した構成に限らず、その趣旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
(付記)
以下は、上述の6 Matlabコードの力学系モデルの近似シミュレーションの実行結果、および、それに用いられたMatlabプログラムのソースコードである。
[シミュレーション開始]
>> testbmap
a_ = 2.500000000000000
b_ = 1.100000000000000
f_ = 4.250000000000000
f2_ = -0.790000000000000
e1 = 0
e2 = 1
n_x = 2
x_ = 0 2.500000000000000
n_a = 2
a_ = 2.500000000000000 1.100000000000000
n_b = 2
b_ = 1.100000000000000 2.500000000000000
e3 = 0
n2_x = 2
x_ = 0 1.800000000000000
n_i = 2
b_ = 2.500000000000000 1.800000000000000
a_ = 1.100000000000000
x_ = 0 1.800000000000000 1.450000000000000
n_i = 3
b_ = 2.500000000000000 1.800000000000000 1.450000000000000
a_ = 1.100000000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Column 4
1.275000000000000
n_i = 4
b_ = 2.500000000000000 1.800000000000000 1.450000000000000
a_ = 1.100000000000000 1.275000000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 5
1.275000000000000 1.362500000000000
n_i = 5
b_ = 2.500000000000000 1.800000000000000 1.450000000000000
a_ = 1.100000000000000 1.275000000000000 1.362500000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 6
1.275000000000000 1.362500000000000 1.406250000000000
n_i = 6
b_ = 2.500000000000000 1.800000000000000 1.450000000000000
a_ =
Columns 1 through 3
1.100000000000000 1.275000000000000 1.362500000000000
Column 4
1.406250000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 6
1.275000000000000 1.362500000000000 1.406250000000000
Column 7
1.428125000000000
n_i = 7
b_ =
Columns 1 through 3
2.500000000000000 1.800000000000000 1.450000000000000
Column 4
1.428125000000000
a_ =
Columns 1 through 3
1.100000000000000 1.275000000000000 1.362500000000000
Column 4
1.406250000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 6
1.275000000000000 1.362500000000000 1.406250000000000
Columns 7 through 8
1.428125000000000 1.417187500000000
n_i = 8
b_ =
Columns 1 through 3
2.500000000000000 1.800000000000000 1.450000000000000
Columns 4 through 5
1.428125000000000 1.417187500000000
a_ =
Columns 1 through 3
1.100000000000000 1.275000000000000 1.362500000000000
Column 4
1.406250000000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 6
1.275000000000000 1.362500000000000 1.406250000000000
Columns 7 through 9
1.428125000000000 1.417187500000000 1.411718750000000
n_i = 9
b_ =
Columns 1 through 3
2.500000000000000 1.800000000000000 1.450000000000000
Columns 4 through 5
1.428125000000000 1.417187500000000
a_ =
Columns 1 through 3
1.100000000000000 1.275000000000000 1.362500000000000
Columns 4 through 5
1.406250000000000 1.411718750000000
x_ =
Columns 1 through 3
0 1.800000000000000 1.450000000000000
Columns 4 through 6
1.275000000000000 1.362500000000000 1.406250000000000
Columns 7 through 9
1.428125000000000 1.417187500000000 1.414453125000000
n_i = 9
b_ =
Columns 1 through 3
2.500000000000000 1.800000000000000 1.450000000000000
Columns 4 through 6
1.428125000000000 1.417187500000000 1.414453125000000
a_ =
Columns 1 through 3
1.100000000000000 1.275000000000000 1.362500000000000
Columns 4 through 5
1.406250000000000 1.411718750000000
xsol = 1.414453125000000
x_ = 0 1.414453125000000
[シミュレーション終了]
以下は、上述の本実施の形態で用いられるMatlabのプログラムのソースコードである。
-----------------------------------------------------------------------
function [b]=hex2bin(h);
% hex2bin- this function converts an array of% hex numbers into binary digits
% Inputs
% h - array of hexadecimal numbers,each row is% a number, the output is a string array
% Outputs
% b- array of binary numbers, each row is a number%
% written by J. Dickerson, ISU, 7/96% updated for matlab 5, 3/98
[nsamp,nbits]=size(h);
nb_bits=ceil(nbits*4);% number of binary bits
% convert to binary
b=zeros(nsamp,nb_bits);
b=num2str(round(b),'%1d');
%b=reshape(bs',nb_bits,nsamp)';
for i=1:nsampfor j=1:nbits
htmp=h(i,j);%i,j,
if (htmp=='0')
b(i,(j-1)*4+1:j*4)='0000';
elseif (htmp=='1')
b(i,(j-1)*4+1:j*4)='0001';
elseif (htmp=='2')
b(i,(j-1)*4+1:j*4)='0010';
elseif (htmp=='3')
b(i,(j-1)*4+1:j*4)='0011';
elseif (htmp=='4')
b(i,(j-1)*4+1:j*4)='0100';
elseif (htmp=='5')
b(i,(j-1)*4+1:j*4)='0101';
elseif (htmp=='6')
b(i,(j-1)*4+1:j*4)='0110';
elseif (htmp=='7')
b(i,(j-1)*4+1:j*4)='0111';
elseif (htmp=='8')
b(i,(j-1)*4+1:j*4)='1000';
elseif (htmp=='9')
b(i,(j-1)*4+1:j*4)='1001';
elseif (htmp=='A')|(htmp=='a')
b(i,(j-1)*4+1:j*4)='1010';
elseif (htmp=='B')|(htmp=='b')
b(i,(j-1)*4+1:j*4)='1011';
elseif (htmp=='C')|(htmp=='c')
b(i,(j-1)*4+1:j*4)='1100';
elseif (htmp=='D')|(htmp=='d')
b(i,(j-1)*4+1:j*4)='1101';
elseif (htmp=='E')|(htmp=='e')
b(i,(j-1)*4+1:j*4)='1110';
elseif (htmp=='F')|(htmp=='f')
b(i,(j-1)*4+1:j*4)='1111';
end;
end;
end;
------------------------------------------------------------------------
function [ret] = logicd(x,beta,a,sigma)
ret=(1-beta)*(x==a)+beta*exp(-sigma*(x-a)^2);
------------------------------------------------------------------------
function [ret]=logicp(x,beta,a,gamma,sigma)
if x>a
dd=1;sg=1;
elseif x<a
dd=0;sg=-1;
else
dd=0;sg=-1;
end
ret=(1-beta)*(x>a)+beta*(dd-(1/2+(1/2-gamma)*sg)*sg*exp(-sg*sigma*(x-a)));
------------------------------------------------------------------------
function [ret]=blogicn(x,beta,a,gamma,sigma)
%eps1=2^-10;ifx>a
dd=1;sg=1;
elseif x<a
dd=0;sg=-1;
else
dd=0;sg=-1;
end
ret=(1-beta)*(x<a)+beta*(1-(dd-(1/2+(gamma-1/2)*sg)*sg*exp(-sg*sigma*(x-a))));
------------------------------------------------------------------------
function [ret]=dblogicd(x,beta,a,sigma)
ret=(1-beta)*(x==a)-2*beta*sigma*(x-a)*exp(-sigma*(x-a)^2);
------------------------------------------------------------------------
function [ret]=dlogicp(x,beta,a,gamma,sigma)
if x>a
dd=0;sg=1;
elseif x<a
dd=0;sg=-1;
else
dd=0;sg=-1;
end
ret=(1-beta)*(x==a)+beta*(dd+sigma*(1/2+(1/2-gamma)*sg)*exp(-sg*sigma*(x-a)));
------------------------------------------------------------------------
function [ret]=dlogicn(x,beta,a,gamma,sigma)
if x>a
dd=0;sg=1;
elseif x<a
dd=0;sg=-1;
else
dd=0;sg=-1;
end
ret=-(1-beta)*(x==a)+beta*(-(dd+sigma*(1/2+(gamma-1/2)*sg)*exp(-sg*sigma*(x-a))));
------------------------------------------------------------------------
function y=testf2(x)
y=x^2-2;
------------------------------------------------------------------------
%写像力学系処理領域:DS_R1 while
function xsol=bwds(a,b,i,delta0)na=1;
nb=1;ni=1;nx=1;nf=1;
n_a=na;n_b=nb;n_i=ni;n_x=nx;n_f=nf;a_(n_a)=a;b_(n_b)=b;i_(n_i)=i;e1=0;
while e1==0
e1=(abs(b_(n_b)-a_(n_a))<delta0);n_x=(nx+1)*(1-e1)+nx*e1;
x_(n_x)=(a_(n_a)+b_(n_b))/2n_i=(ni+1)*(1-e1)+ni*e1i_(n_i)=(i_(ni)+1)*(1-e1);
n_f=(nf+1)*(1-e1)+nf*e1;
f(n_f)=testf2(x_(n_x));e2=(f_(n_f)>=0);e3=(f_(n_f)<=0);
%e4=1-(1-(1-e2))*(1-e3);
n_b=(nb+1)*e2+nb*(1-e2);
b_(n_b)=x_(n_x)*e2+b_(nb)*(1-e2)n_a=(na+1)*e3+na*(1-e3);
a_(n_a)=x_(n_x)*e3+a_(na)*(1-e3)na=n_a;
nb=n_b;ni=n_i;nx=n_x;nf=n_f;end
xsol=x_(n_x)
------------------------------------------------------------------------
% 写像処理領域:F_R1
format longa_(1)=2.5
b_(1)=1.1
f_(1)=testf2(a_(1))
f2_(1)=testf2(b_(1))e1=(f_(1)*f2_(1)>0)
% error('no sign change').*e1+phi.*(1-e1)if e1==1error('no sign change');
end
e2=(f_(1)>0)
% n_x=0.*e2+phi.*(1-e2)n_x=1+e2
%x_(n_x)=a_(1)*e2+phi.*(1-e2)x_(n_x)=a_(1)*e2
n_a=1+e2
a_(n_a)=b_(1)*e2+a_(1)*(1-e2)n_b=1+e2
b_(n_b)=x_(n_x)*e2+b_(1)*(1-e2)
% now f(a)<=0<=f(b)
i_(1)=2;
% counts number of function evaluationse3 =(f_(1)==0)
n2_x=(n_x+1)*e3+(n_x+1)*(1-e3)
x_(n2_x)=a_(n_a)*e3+bwds(a_(n_a),b_(n_b),i_(1),10^(-3))*(1-e3)
---------------------------------------------------------------------
以上、ソースコード終わり。
手続き型プログラミング言語の一種による標準的な二分法プログラムのソースコードを示す説明図である。 本発明の一実施の形態であるプログラム論理の検証方法、プログラム論理の検証プログラムにて用いられる論理演算のためのBoolean関数の真理値表の一例を示す概念図である。 IEE754における数値の内部表現を示す説明図である。 浮動小数点の演算例の出力結果を示す対話画面の説明図である。 浮動小数点の演算例の出力結果を示す対話画面の説明図である。 連続変形型の論理関数とその導関数の例を示す線図である。 連続変形型の論理関数とその導関数の例を示す線図である。 連続変形型の論理関数とその導関数の例を示す線図である。 連続変形型の論理関数とその導関数の例を示す線図である。 浮動小数点の演算例の出力結果を示す対話画面の説明図である。 C言語のプログラム例を示す説明図である。 C言語のプログラム例を示す説明図である。 if文を含むプログラム例を示す説明図である。 elseif文のプログラム例を示す説明図である。 switch文のプログラム例を示す説明図である。 for文のプログラム例を示す説明図である。 while文のプログラム例を示す説明図である。 書き換えた結果の写像処理領域のプログラムコード例を示す説明図である。 書き換えた結果の写像力学系処理領域のプログラムコード例を示す説明図である。 本発明の一実施の形態であるプログラム論理の検証方法、プログラム論理の検証プログラムが実施される情報処理システムの構成例を紙面ブロック図である。 本発明の一実施の形態である検証ツールの作用の一例を示すフローチャートである。 本発明の一実施の形態である検証ツールの作用の一例を示すフローチャートである。 本発明の一実施の形態である検証ツールの作用の一例を示すフローチャートである。 本発明の一実施の形態である検証ツールの作用の一例を示すフローチャートである。 本発明の一実施の形態である検証ツールにて用いられる定義文の一例を示す概念図である。 本発明の一実施の形態である検証ツールにて用いられる定義文の一例を示す概念図である。 本発明の一実施の形態である検証ツールにて用いられる定義文の一例を示す概念図である。 本発明の一実施の形態である検証ツールによってディスプレイに表示されるモデル表示画面を示す説明図である。 潜在的な問題を含むC言語のプログラムを示す説明図である。 潜在的な問題を含むC言語のプログラムを示す説明図である。 解析対象となるC言語のプログラムを示す説明図である。 本発明の実施の形態である検証ツールの解析中に出力される情報例を示す説明図である。 本発明の実施の形態である検証ツールの解析中における変数の時間的発展を説明する説明図である。 本発明の実施の形態である検証ツールの解析中における変数の時間的発展を説明する説明図である。 本発明の実施の形態である検証ツールの解析中における変数の時間的発展を説明する説明図である。
符号の説明
1〜3 エラーレベル
1−1 変数宣言の領域
1−2 写像処理領域
1−3 写像力学系領域
200 情報処理システム
201 MPU
202 主記憶
203 外部記憶装置
204 ディスプレイ
205 キーボード
206 ネットワークインタフェース
301 オペレーティングシステム
302 検証ツール
303 言語処理系
401 ソースコード
402 判定結果ファイル
403 ログファイル
501 モデル表示画面
502 オリジナル領域
503 中間領域
504 解析結果領域

Claims (2)

  1. マイクロプロセッサと、前記マイクロプロセッサが実行するプログラムとしての検証ツールが格納される主記憶と、前記検証ツールを実行する前記マイクロプロセッサによってアクセスされる情報が格納される外部記憶装置とを含む情報処理システムにおいて、
    手続き型プログラミング言語のプログラムコードを前記外部記憶装置から入力し、前記マイクロプロセッサが前記プログラムコードを写像および/または写像力学系に置き換える第1ステップと、
    前記写像および/または写像力学系に数学的手法に基づくアルゴリズムを適用することにより、前記マイクロプロセッサが前記プログラムコードの信頼性の検証を行う第2ステップと、
    を含み、
    前記第1ステップでは、
    前記プログラムコードを、変数宣言領域、写像処理領域、写像力学系処理領域に区別するステップと、
    前記変数宣言領域では変数宣言を、識別子および当該識別子が属するデータ構造を含む数学定義へ変換するステップと、
    前記写像処理領域では、条件分岐文および反復実行文を、連続微分可能写像を用いてモデル化するステップと、
    前記変数宣言領域および前記写像処理領域以外の前記写像力学系処理領域では、終了条件を含む入力と出力が定義される写像を再帰的に構成するステップと、
    を前記マイクロプロセッサに実行させ、
    前記第2ステップにおける前記信頼性の検証では、
    前記プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第1エラーレベルの検出と、
    前記プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第2エラーレベルの検出と、
    前記第1エラーレベルおよび前記第2エラーレベルの論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、前記プログラムコード中のカオスの存在が引き起こすプログラム動作のエラーである第3エラーレベルの検出と、
    を前記マイクロプロセッサに実行させる、
    ことを特徴とするプログラム論理の検証方法。
  2. マイクロプロセッサと、前記マイクロプロセッサが実行するプログラム論理の検証プログラムが格納される主記憶と、前記マイクロプロセッサによってアクセスされる情報が格納される外部記憶装置と、前記マイクロプロセッサが処理する情報を可視化して表示するディスプレイと、を含む情報処理システムにおいて、
    プログラム論理の検証プログラムは、
    手続き型プログラミング言語のプログラムコードを写像および/または写像力学系に置き換える第1ステップと、
    前記写像および/または写像力学系に数学的手法に基づくアルゴリズムを適用することにより、前記プログラムコードの信頼性の検証を行う第2ステップと、
    をマイクロプロセッサに実行させ、
    前記第1ステップでは、
    前記プログラムコードを、変数宣言領域、写像処理領域、写像力学系処理領域に区別するステップと、
    前記変数宣言領域では変数宣言を、識別子および当該識別子が属するデータ構造を含む数学定義へ変換するステップと、
    前記写像処理領域では、条件分岐文および反復実行文を、連続微分可能写像を用いてモデル化するステップと、
    前記変数宣言領域および前記写像処理領域以外の前記写像力学系処理領域では、終了条件を含む入力と出力が定義される写像を再帰的に構成するステップと、
    を前記マイクロプロセッサに実行させ、
    前記第2ステップにおける前記信頼性の検証では、
    前記プログラムコードの無限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第1エラーレベルの検出と、
    前記プログラムコードの無限桁演算の論理関係の整合性は検証されているが、有限桁演算の論理関係の整合性のエラーが引き起こすプログラム動作のエラーである第2エラーレベルの検出と、
    前記第1エラーレベルおよび前記第2エラーレベルの論理関係の整合性は検証されており、局所的な決定的なルールには問題ないが、前記プログラムコード中のカオスの存在が引き起こすプログラム動作のエラーである第3エラーレベルの検出と、
    を前記マイクロプロセッサに実行させる、
    ことを特徴とするプログラム論理の検証プログラム。
JP2007031369A 2007-02-09 2007-02-09 プログラム論理の検証方法、プログラム論理の検証プログラム Active JP4958574B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007031369A JP4958574B2 (ja) 2007-02-09 2007-02-09 プログラム論理の検証方法、プログラム論理の検証プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007031369A JP4958574B2 (ja) 2007-02-09 2007-02-09 プログラム論理の検証方法、プログラム論理の検証プログラム

Publications (2)

Publication Number Publication Date
JP2008197851A JP2008197851A (ja) 2008-08-28
JP4958574B2 true JP4958574B2 (ja) 2012-06-20

Family

ID=39756746

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007031369A Active JP4958574B2 (ja) 2007-02-09 2007-02-09 プログラム論理の検証方法、プログラム論理の検証プログラム

Country Status (1)

Country Link
JP (1) JP4958574B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112540284A (zh) * 2020-11-12 2021-03-23 中铁第四勘察设计院集团有限公司 一种继电电路诊断方法及系统
WO2022219770A1 (ja) * 2021-04-15 2022-10-20 日本電信電話株式会社 関数変換装置、関数変換方法、およびプログラム
WO2022219768A1 (ja) * 2021-04-15 2022-10-20 日本電信電話株式会社 関数変換装置、関数変換方法、およびプログラム

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1063537A (ja) * 1996-08-21 1998-03-06 Fujitsu Ltd プロパティ検証方法および装置
EP1591887A1 (en) * 2003-01-28 2005-11-02 Catena Corporation Software development preprocessing method, software control method, software development method, and software development device

Also Published As

Publication number Publication date
JP2008197851A (ja) 2008-08-28

Similar Documents

Publication Publication Date Title
Cordeiro et al. SMT-based bounded model checking for embedded ANSI-C software
US8209646B2 (en) Apparatus and method for analyzing source code using path analysis and Boolean satisfiability
JPWO2016121074A1 (ja) ソフトウェア検査装置
Binh Mutation operators for Simulink models
Kaur et al. Improving the quality of software by refactoring
Barbosa et al. Flexible proof production in an industrial-strength SMT solver
JP4958574B2 (ja) プログラム論理の検証方法、プログラム論理の検証プログラム
US8527975B2 (en) Apparatus and method for analyzing source code using memory operation evaluation and boolean satisfiability
Roşu et al. Testing extended regular language membership incrementally by rewriting
Ding et al. Deadlock checking for one-place unbounded Petri nets based on modified reachability trees
Barnett et al. Non-clausal Redundancy Properties.
Noikajana et al. Web service test case generation based on decision table (short paper)
Ayav et al. Identifying critical architectural components with spectral analysis of fault trees
Saeedloei et al. Timed scenarios: consistency, equivalence and optimization
Lee et al. External don’t cares in logic synthesis
Singh et al. Knowledge-guided methodology for third-party soft ip analysis
Falcone et al. Enforcement monitoring wrt. the safety-progress classification of properties: NOTE: ACM has found that the authors of this paper failed to cite a work they previously published with much identical content entitled Synthesizing Enforcement Monitors wrt. the Safety-Progress Classification of Properties. Published in December 2008 in the Springer LNCS series for the ICISS 2008 conference DOI= http://dx. doi. org/10.1007/978-3-540-89862-7_3
Li et al. Tabular‐expression‐based method for constructing metamorphic relations
US20040111684A1 (en) Design method of logic circuit
Hills et al. A rewriting logic semantics approach to modular program analysis
Przigoda et al. Four-valued logic in uml/ocl models: A “playground” for the mvl community
Champarnaud et al. An efficient algorithm to test whether a binary and prolongeable regular language is geometrical
Smidts et al. The Development of the Integrated System Failure Analysis and Its Applications
Singh et al. An essence of software maintenance prediction using the fuzzy model for aspect oriented software
Bignall et al. Multiple-valued logic as a programming language

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100201

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110527

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110607

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110801

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20111220

RD12 Notification of acceptance of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7432

Effective date: 20120127

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20120127

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120217

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120306

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120319

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150330

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Ref document number: 4958574

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313117

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

S533 Written request for registration of change of name

Free format text: JAPANESE INTERMEDIATE CODE: R313533

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313117

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250