JPH09282173A - プログラムの静的解析方法 - Google Patents

プログラムの静的解析方法

Info

Publication number
JPH09282173A
JPH09282173A JP8087940A JP8794096A JPH09282173A JP H09282173 A JPH09282173 A JP H09282173A JP 8087940 A JP8087940 A JP 8087940A JP 8794096 A JP8794096 A JP 8794096A JP H09282173 A JPH09282173 A JP H09282173A
Authority
JP
Japan
Prior art keywords
program
loop
condition
satisfied
analysis
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.)
Pending
Application number
JP8087940A
Other languages
English (en)
Inventor
Shigehisa Sato
茂久 佐藤
Takayoshi Iizuka
孝好 飯塚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP8087940A priority Critical patent/JPH09282173A/ja
Publication of JPH09282173A publication Critical patent/JPH09282173A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

(57)【要約】 【課題】本発明は、プログラミング言語の処理系におい
て、プログラムの静的な解析を、より効果的に行うこと
を目的とする。 【解決手段】ソースプログラムの字句解析、構文解析、
意味解析を行い中間コードを生成し、中間コードに対し
て制御及びデータの流れを解析してフロー情報を生成
し、プログラムが停止すると仮定できるかどうかを判定
し、停止できると仮定できるなら停止するための必要条
件を求め、その必要条件を満たすようにフロー情報を更
新する。従来の静的解析方法よりも解析精度が向上す
る。あるいは、従来の解析方法よりも少ない手間で同等
以上の精度の解析を行える。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】プログラミング言語で記述さ
れたソースプログラムにおける制御の流れやデータの流
れを、そのソースプログラムを実行すること無しに解析
する、静的解析方法に関する。
【0002】
【従来の技術】プログラミング言語で記述されたプログ
ラムの処理系、例えば、最適化コンパイラ・並列化コン
パイラ・プログラムの検証システムなどでは、プログラ
ムの制御の流れ(制御フロー)やデータの流れ(データ
フロー)について、プログラムを実行すること無しに調
べる、静的な解析が行われる。
【0003】プログラムの静的な解析を行うためには、
まずソースプログラムに対して字句解析・構文解析・意
味解析を行い中間コードを生成し、得られた中間コード
に対して制御フロー解析やデータフロー解析を行い、解
析結果(制御フロー情報やデータフロー情報)を出力す
る。
【0004】データフロー解析を行うためには、プログ
ラム中の各文で定義または使用される変数を知る必要が
ある。そのために、変数間の別名関係の解析や、手続き
呼び出しの副作用についての解析が行われる。
【0005】各文で定義または使用される変数を解析し
た後、到達定義や生存変数などの、データの流れに関す
る情報を解析する。別名解析や手続き呼び出しの副作用
の解析の精度が低いと、実際には生じない定義や使用も
あるものと見なされるため、データフロー情報の精度が
低くなる。
【0006】制御フロー解析及びデータフロー解析につ
いては、例えば次の文献に記されている。
【0007】コンパイラ 原理・技法・ツール、A.
V.エイホ、R.セシィ、J.D.ウルマン共著、原田
賢一訳、サイエンス社、1990年(文献1)C言語や
Fortran90のようにポインタを用いるプログラミング
言語では、ポインタによって生じる別名関係の解析が必
要である。ポインタによって生じる別名関係は、ポイン
タの定義文を調べてポインタの指示し得る変数を求める
ことによって、ある程度は解析できる。その方法に例え
ば特開平6−348475号がある。しかし、ポインタ
によって生じる別名関係を常に正確に解析する方法はな
いことが証明されている。
【0008】特に、動的なメモリ割り付けによって実現
された再帰的データ構造を用いるプログラムの別名関係
は解析が困難である。再帰的データ構造には、リンクト
リスト、循環リスト、ツリー、グラフなどがあり、様々
な分野のソフトウェアで使用されている。この様なデー
タ構造に対しては、ループや再帰呼び出しによって各要
素を順に処理することがよく行われるため、別名関係の
解析精度はプログラムの実行性能へ大きく影響し得る。
【0009】再帰的データ構造に対しては、その構造の
各要素間の関係を解析することによって、効果的な別名
解析が行える場合がある。その方法は、例えば次の文献
に述べられている。
【0010】Joseph Hummel,Laurie J.Hendre
n,and Alexandru Nicolau,AGeneral Data
Dependence Test for Dynamic,Pointer−Base
d Data Structures,Proceedings of the AC
M SIGPLAN '94Conference on Program
ming Languages Design and Implementation,
1994(文献2)この様な方法では、リストやツリー
のように規則的な構造の場合には、ポインタの定義文か
ら、作成されるデータ構造を解析することによって、そ
の要素間の関係をある程度正確に解析できる。ただし、
一般にはデータを作成する手続きとデータを利用する手
続きとが異なるため、手続き間解析を行う必要がある。
【0011】
【発明が解決しようとする課題】再帰的データ構造に対
する別名解析の方法には、以下の欠点がある。
【0012】1)ポインタの定義文から、作成されるデ
ータ構造を解析する方法では、比較的単純なデータ構造
しか精度の良い解析ができない。
【0013】2)データの作成と使用が複数の手続きに
またがっていることが多いため、手続き間解析を行わな
いと精度の良い解析は困難である。
【0014】本発明の目的の一つは、別名解析をはじめ
とする様々な静的解析の問題で、従来の方法よりも精度
の良い解析を行うことにある。本発明のもう一つの目的
は、従来の方法よりも少ない手間で同等以上の精度の解
析を行うことにある。
【0015】
【課題を解決するための手段】本発明による静的解析方
法は、(a)ソースプログラムを読み込み、字句解析・構
文解析・意味解析を行い中間コードを生成するフロント
エンド、(b)中間コードに対して制御の流れ及びデータ
の流れを解析してフロー情報を生成するフロー解析、
(c)プログラムを実行した時に必ず停止すると仮定して
良いかどうかを判定する停止性判定、(d)プログラムが
停止すると仮定できるならば、停止するための必要条件
を求める停止条件解析、(e)前記必要条件が満たされる
ものとして、前記フロー解析を更新するフロー情報更
新、の各ステップによって実現される。
【0016】ステップ(a)とステッブ(b)は従来の
言語処理システムと同様の処理を行う。ステップ(c)
は、解析対象のプログラムを実行した時に、必ず実行が
停止すると仮定できるかどうかを判定し、プログラムの
各部分毎に真(停止すると仮定して良い)または偽(停
止しない可能性がある)の値を出力する。ここでは、実
行時オプションやプログラム中に記述する指示文を元に
判定する。ステップ(d)では、停止性判定部が真を出
力した部分について、その部分の実行が停止するための
必要条件を解析し、出力する。例えば、ループや手続き
の再帰呼び出しのように、無限に繰り返されうる制御機
構に対して、それが実行される際のデータに関する制約
条件として、停止するための必要条件が求められる。ス
テップ(e)では、ステップ(d)でもとめた条件が満
たされるものとしたときのフロー情報を解析し、適当な
形式で出力する。このとき、プログラムが停止するため
の条件をフロー情報に含めてもよい。
【0017】ステップ(e)で出力されたフロー情報
は、プログラムの検証や最適化、並列化などに利用でき
る。プログラムの検証のためには、プログラムの実行時
に停止条件を満たさなかった場合、実行を停止したり診
断メッセージを出力したりするように、プログラムの変
換を行うことができる。最適化や並列化に利用する際に
は、停止条件が常に成り立つものとして目的コードを生
成する方法と、ステップ(c)の処理を行わずに、停止
条件が成り立つか否かをプログラムの実行時に判定し、
停止条件が成り立つ場合に実行するコードと停止条件が
成り立たない場合に実行するコードのいずれかの実行を
選択するような目的コードを生成する方法がある。
【0018】なお、本発明で、プログラムの実行が停止
するということは、その実行中に割り込みや例外が発生
しなかった時に、プログラムの終了を示す文に制御が必
ず到達することを意味する。プログラムの終了を示す文
とは、例えばC言語ではmain関数のreturn文やexit()関
数、FortranのSTOP文などである。プログラムのあ
る部分の実行が停止するとは、その部分の次に実行され
る文へ制御が必ず到達することである。例えば、ループ
であればその次の文、手続きであればその呼び出し側の
手続きへの復帰文へ、制御が到達することである。
【0019】
【発明の実施の形態】以下、本発明の実施例を詳細に説
明する。
【0020】図1は本発明を静的解析システムに適用し
た場合の一実施例の処理フローを示す図である。
【0021】フロントエンド(3)は、プログラミング
言語で記述されたソースプログラム(1)を読み込み、
字句解析・構文解析・意味解析を行い、中間コード
(4)を生成する。生成された中間コードに対して、プ
ログラムの意味を変えない範囲で変形してあっても良
い。例えば、静的単一代入形式(Static Single A
ssignment Form)に変形したり、何らかの最適化を行
っても良い。
【0022】停止性判定(8)では、解析対象のプログ
ラムが、実行した時に停止すると仮定して良いかどうか
判定する。結果は真(停止すると仮定できる)または偽
(停止しないかも知れない)の論理値によって表され
る。この判定は、静的解析システムの実行時オプション
か、ソースプログラム中に記述された指示文に基づいて
行われる。実行時オプションも指示文も指定されていな
い場合は、システムの既定値を用いる。停止性はプログ
ラム全体に対して指定することも、ループや手続きなど
の各部分毎に指定することもできる。
【0023】停止条件解析部(9)では、プログラム中
の停止性判定で真を出力した部分に対して、その部分の
実行が停止するための必要条件を解析する。プログラム
が停止するための必要十分条件を解析することは一般に
は不可能であり、停止するための必要条件も常に検出で
きるわけではない。求められた必要条件は、プログラム
中で使用される変数と、定数・算術演算子・関係演算子
・論理演算子を組み合わせた論理式として表される。さ
らに、必要条件を表現するための変数や演算子を導入す
ることもできる。プログラムの実行が停止するならば、
プログラムの実行中にこの論理式が常に真であるものと
見なして良い。プログラムの実行中に変数が論理式が偽
となるような値を取るならば、プログラムの実行が停止
するという仮定は間違っていることになる。
【0024】フロー情報更新部(14)では、停止条件
が得られた場合にその条件を満たす時の制御及びデータ
の流れを反映するように、フロー情報(6)を更新し、
得られたフロー情報(15)を適当な形式で出力する。
【0025】プログラムが停止するための必要条件を求
められるプログラムの構成要素の例としては、ループと
手続きの再帰呼び出しがある。ループでは、有限回の繰
り返しのうちに繰り返しの終了条件のいずれかが成立し
なければ、そのループは無限に繰り返されることにな
る。手続きの再帰呼び出しでは、有限回の呼び出しのう
ちに再帰的な呼び出しを行わない条件のいずれかが成立
しなければ、再帰呼び出しを無限に続けることになる。
【0026】以下、具体的なプログラムを例に、ループ
に対する停止条件解析の処理内容を説明する。
【0027】第一のプログラム例として、本発明をリン
クトリスト(linked list)を処理するプログラムの別
名解析に適用した場合について説明する。
【0028】リンクトリストを先頭から順にたどり、各
ノードに対して処理を行う関数の例を、図2に示す。リ
ンクトリストは図3に示すように、ノードがポインタで
接続されており、ポインタをたどることによって先頭の
ノードから順にノードを処理していくことができる。そ
の際、同じノードを二度たどることはない。
【0029】このループ内で参照されるポインタnodeの
指示先が毎回異なるかどうかは、手続き間解析を行えば
解析することができる。その方法は例えば(文献2)に
記されている。
【0030】手続き内のみを対象にしたデータフロー解
析では、以下のような解析が行われる。まず、リストの
先頭のノードを表す仮引数topの値は、他の手続きで定
義されるため、その値についての情報はない。よって、
ループの各繰り返しで定義・使用されるポインタnodeの
指示先についての情報も得られない。従って、topとnod
eは、手続き外でアドレスを参照可能な任意のデータを
指示している可能性があると見なされる。従って、ルー
プの各繰り返しでnodeの値が同じである可能性があると
考えなければならない。このことから、ある繰り返しで
値の定義されたnode->valueと同じデータが、別の繰り
返しで定義・使用される可能性があると考える必要があ
る。
【0031】ここで、静的解析システムの出力するフロ
ー情報に、次のような文の間の依存関係が含まれるもの
とする。同一ループ中にない文SとTとの間に依存関係
があるとき、これをベクトル(S,T,0)で表す。一
方、同一ループ中の文Sとループのn回後の繰り返しで
実行される文Tとの間に依存があるとしたとき、これを
ベクトル(S,T,n)で表す。ただし、nは任意の整
数とする。何回後の繰り返しとの依存か特定できない、
言い替えると、全ての繰り返しとの間に依存が有り得る
場合は(S,T,*)で表す。ここでいう依存関係は、
フロー依存・出力依存・逆依存を併せていうものとす
る。
【0032】従来の静的解析方法では、図2のプログラ
ムで、文S13で定義されるnode->valueは他の全ての
繰り返しでも定義され得ると考える必要があったため、
(S13,S13,*)という依存関係が検出される。
【0033】本発明によれば、図2のプログラムのルー
プ内で定義・使用される変数nodeの値が繰り返し毎に異
なり、S13と他の繰り返しのS13との間には依存関
係がないことを、手続き内の解析のみで検出することが
できる。
【0034】図1に示す静的解析方法の各構成要素は、
以下のように構成される。まず、フロントエンド(3)
はC言語で記述されたソースプログラム(1)を入力と
して、中間コード(4)を出力する。実行時オプション
(2)が指定されているときには、その内容を中間コー
ドに付加する。次に、フロー解析(5)で制御フローと
データフローを解析する。中間コードや制御フロー解
析、データフロー解析の詳細については例えば(文献
1)に記載されている。
【0035】図2のプログラムに対する中間コードを図
4に示す。中間コードは基本ブロックをノードとし、基
本ブロック間の制御の流れをエッジとするフローグラフ
で表される。基本ブロック(フローグラフのノード)
は、それに含まれる文のリストを持つ。文はここではソ
ースプログラムの文をそのまま用いているが、実際には
木構造・三つ組・四つ組などで表現される。関数div_li
st()は四つの基本ブロックからなる。基本ブロックB2
はwhile文の条件判定部を表しており、B2から出てい
る二本のエッジにはそれぞれTRUEとFALSEのラ
ベルが付けられている。これは、while文の条件がそれ
ぞれ成立するとき(TRUE)と成立しないとき(FA
LSE)の分岐方向を表す。
【0036】フロー解析(5)の際に、手続き中の各ル
ープ毎にループ表(7)を作成する。ループ表の構造を
図5に示す。それぞれのフィールドには以下のような値
が設定される。ループ構成基本ブロック(21)には、
ループ中に含まれる基本ブロックのリストが設定され、
図2のプログラムではB2とB3からなる。ループ終了
条件式(22)は、ループ外への分岐の条件が設定され
る。ループ外への分岐の条件を持たないループや、複数
の条件を持つループもある。図2のプログラムでは、ル
ープ外への分岐はwhile文の条件判定のみであるから、
ループ外へ分岐する条件としてcur==NULLが設定さ
れる。ループが繰り返されている間、このループ終了条
件は常に不成立である。本発明に関連する他のフィール
ドの内容については、使用する都度説明する。
【0037】停止性判定(8)では、ループ表のループ
停止性(23)に真(TRUE)または偽(FALS
E)の値を、ループ毎に設定する。停止性が真の時、そ
のループは停止すると仮定して良く、偽の時は停止しな
い可能性がある。実行時オプションや指示文で指定する
際には、フロントエンドで中間コードの例えばwhile文
に対して真偽を設定しておく。停止性判定ではその情報
を利用してループ表に値を設定する。ここでは、システ
ムの既定値として、全てのループのループ停止性に真を
設定するものとする。
【0038】停止条件解析(9)では、ループ停止性
(23)が真である各ループについて、ループの停止す
る必要条件(停止条件)の検出を試みる。停止条件が求
められたら、ループ表のループ停止条件(27)に停止
条件を設定する。この必要条件は、プログラム中で使用
される変数と、定数・算術演算子・関係演算子・論理演
算子を組み合わせた論理式として表される。
【0039】与えられたループの停止条件の解析は、ル
ープ制御変数の検出(11)、ループ終了条件式の検査
(12)、ループ停止条件の解析(13)の三つのステ
ップからなる。
【0040】ループ制御変数の検出(11)では、ルー
プの繰り返しを司る、制御変数を求める。以下の三つの
条件を満たす変数をループ制御変数とする。
【0041】条件1:ループ終了条件式でその変数の値
が使用されている。
【0042】条件2:ループの繰り返し毎に必ず一度同
じ式で値が更新される。
【0043】条件3:条件2の更新を行う式の右辺の値
は、ループ不変変数と制御変数の値のみから定まる。
【0044】ループの終了条件式がないなど、制御変数
を決められない場合には、ループの停止条件も決められ
ず、以下の処理は行われない。図2の例で言うと、変数
nodeがループ制御変数となる。なぜなら、終了条件式no
de==NULLで値が使用され、ループの繰り返し毎にno
de=node->nextという式で更新され、更新式の右辺node-
>nextの値はnodeの値のみから定まるからである。制御
変数が検出できた場合、ループの入り口での制御変数の
値を制御変数の初期値(25)に設定する。nodeの初期
値はtopである。さらに、上記の条件2を満たす式を制
御変数更新式(26)に設定する。nodeの更新式はnode
=node->nextである。
【0045】ループ終了条件式の検査(12)では、ル
ープの終了を判定する条件式の値が、ループ不変な変数
と制御変数の値のみから決定できるかどうかを調べる。
もし、制御変数の値からは条件式の値を決定できない時
は、ループの停止条件も決められず、以下の処理は行わ
れない。図2の例ではループ終了条件式がnode==NUL
Lであるから、この式の真偽は制御変数nodeの値のみか
ら決まる。
【0046】停止条件の解析(13)では、条件式・制
御変数・制御変数の更新式から、ループの繰り返しが有
限回で停止するための必要条件を求める。
【0047】一般に、制御変数をvar,varのi回目の繰
り返しでの値をvar(i)、条件式をCond(var)とすると、
停止条件は以下のように決定される。もし、ループの繰
り返しが終了するならば、Cond(var(n))が偽となるn
(>=1)があるはずである。もし、i>0かつj>0かつ
i<j<nである整数iとjについて、var(i)とvar(j)
が等しいとすると、任意のk>0に対してvar(i+k)とva
r(j+k)が等しくなければならない。言い替えると、ルー
プ制御変数の値は、var(i)からvar(j-1)までの値が順に
繰り返されると言うことである。すると、あるj>k>
iに対してvar(k)とvar(n)が等しくなる。このことはi
<j<nであることと矛盾する。従って、n>i>j>
0である任意のiとjに対して、var(i)とvar(j)は異な
る値を取らなければならない。このことは、ループの繰
り返しが有限回であるならば、ループ制御変数は二度と
同じ値を取らない、ということである。
【0048】図2のプログラムで言うと、nodeの値がル
ープの途中で同じ値を取ったとすると、リストが巡回し
てしまうため、このループは無限に繰り返すことにな
る。よってこのループが停止するための必要条件は、no
deの値が毎回異なることである。このことは、ポインタ
nodeの指示先が毎回異なるということでもある。従って
ループの停止条件は、次のように表せる。プログラム中
の変数のみを用いて表すとすると、node!=node->nextと
表せる。しかし、この表現では次の繰り返しとの間の依
存がないことしか表していないため、ループの繰り返し
番号を表す変数iとjを導入して、i==j||node(i)!=n
ode(j)と表す方がより正確である。
【0049】以上から、次の三つの条件 条件1:ループ制御変数がポインタである。
【0050】条件2:ループ制御変数(pとする)の更
新式が、p=*(p+c)の形式である。ただし、cは定数
である(node->nextという式はある定数cを用いて*(n
ode+c)と表せる)。
【0051】条件3:ループ停止条件が、p!=NULL
の形式である。
【0052】を満たすとき、ループ表のループ停止条件
(27)に、i==j||p(i)!=p(j)という論理式を設定す
る。ただし、p(i)はループ制御変数pのi回目の繰り返
しでの値、iとjはループの繰り返し番号である。ある
いは、ループ停止条件としてp!=*(p+c)という式を設定
しても良い。
【0053】停止条件解析(9)でループの停止条件が
求められた場合、フロー条件更新(14)で、停止条件
が満たされるときのフロー情報を解析する。この例で
は、次のような方法でフロー情報を更新する。フロー解
析(5)で検出された各依存関係について、ループ停止
条件(27)の論理式を満たすか否か調べ、満たされな
いものを削除する。前述の依存関係(S13,S13,
*)について調べると、この依存関係を生じさせる変数
node->valueのアドレスは、ループ停止条件からループ
の繰り返し毎に異なることがわかる。従って、異なる繰
返し間のnode->valueの参照の間に依存関係は生じず、
(S13,S13,*)を削除することができる。
【0054】第二のプログラム例として図6のプログラ
ムの場合を説明する。図6のプログラムは図2のプログ
ラムとほとんど同じであるが、文S22のループの終了
する条件が異なる。リンクトリストを処理する方法とし
て、図3のようにリストの最後のノードのnextフィール
ドをNULLにする方法の他に、最後のノードとしてne
xtフィールドが自分自身を指すノードを追加する方法が
ある。この最後のノードは番兵(sentinel)と呼ばれ
る。番兵を持つリストでは構造が非巡回ではなくなるた
め、図2のプログラムに対しては正確な解析の可能な方
法でも、番兵のあるリストではうまく解析できない場合
がある。本発明では番兵のあるリストに対しても正確な
解析ができる。
【0055】図2のループの解析との違いは、条件式の
みである。以下、停止条件解析部の処理を説明する。制
御変数の検出(11)では、制御変数としてnodeが検出
される。終了条件式の検査(12)では、図6のループ
の条件式node!=node->nextの値は制御変数nodeの値のみ
から決まることが言える。停止条件の解析(13)で
は、図2のループと全く同じ仮定で同じ結論が得られ
る。実際、以下の理由でこの結論は正しい。ノードの数
をnとすると、番兵となるノードはnode(n)であり、nod
e(n)->nextとnode(n)は等しい。しかし、node(n)->next
をnodeの値としてループの本体が実行されることはな
い。つまり、node(n)->nextの値は条件式でのみ使用さ
れ、ループ本体では使用されないため、ループ本体で使
用されるnodeの関係には影響しないのである。
【0056】このことから、停止条件を求めるためのよ
り一般的な方法は以下のようになる。即ち、次の条件 条件1:ループ制御変数がポインタである。
【0057】条件2:ループ制御変数(pとする)の更
新式が、p=*(p+c)の形式である。ただし、cは定数であ
る(node->nextという式はある定数cを用いて*(node+
c)と表せる)。
【0058】条件3:ループ停止条件が、p!=qの形式で
ある。ただしqはループ不変式である。
【0059】を満たすとき、ループ表のループ停止条件
(27)に、i==j||p(i)!=p(j)という論理式を設定す
る。ただし、p(i)はループ制御変数pのi回目の繰り返
しでの値、iとjはループの繰り返し番号である。上記
の条件は、図2のプログラムの停止条件の解析にも適用
できる。
【0060】ここでは巡回のあるリストの例として番兵
がある場合を用いたが、その他にもリストの最後のノー
ドが先頭のノードを指している、循環リスト(circular
list)と呼ばれるリストや、ノードがその次のノードと
前のノードへのポインタを持つ、双方リスト(doubly li
nked list)と呼ばれるリストなどもある。これらの場合
にも同様の解析が行える。また、与えられた先頭ノード
が真にリスト先頭である必要はなく、リストを途中から
たどる場合にもここに述べた解析方法が適用できる。
【0061】以上は、本発明をポインタを制御変数とす
るループに適用した時の実施例である。次に、制御変数
が整数のループに対する実施例を説明する。
【0062】図8はループを含むプログラムの例であ
る。このループについて図1の処理フローに沿って処理
を行うと、フロー解析(5)でループ表が作成され、ル
ープ構成基本ブロック(21)とループ終了条件式(2
2)が設定される。ループ終了条件式(22)はこの場
合i==endとなる。停止性判定(8)でループ停止性に真
(TRUE)が設定されたとすると、停止条件解析
(9)は以下のように行われる。ループ制御変数の検出
(11)では、変数iが制御変数として検出される。こ
のiの初期値(25)はstart+1であり、更新式(2
6)はi++である。次にループ終了条件式の検査(1
2)では、終了条件式i==endが制御変数iとループ不変
変数endの式であるため、停止条件が解析できるための
条件を満たす。
【0063】このループの停止条件は以下のように求め
られる。もしループが停止するならば、iの初期値star
t+1に1を有限回加えると、endと等しくならなければな
らない。このとき明らかにstart<endでなければならな
い。よって、停止条件の解析(13)では停止条件(2
7)にstart<endを設定する。ただし、ここでは加算の
結果がオーバーフローした場合は不正な値となり、考慮
する必要はないものとする。フロー情報の更新(14)
では、start<endという条件が成り立つものとして、フ
ロー情報を更新する。例えば、start<iが常に成り立つ
ため、S32で値が書き込まれるarray[i]は、array[st
art]ではありえない、従って、ループ中でarray[start]
が書き換えられることはないことがわかる。
【0064】これまでの実施例はいずれもループの停止
条件の解析方法を述べた。次に、再帰呼び出しに対する
実施例について説明する。
【0065】図9は再帰呼び出しを含むプログラムの例
である。このプログラムは非巡回有向グラフ(DAG;
Directed Acyclic Graph)のノードを重複を許し
てたどる。ただし、非巡回であることとは自明ではな
い。DAGのデータ構造の例を図10に示す。図では、
ノードを楕円で表し、フィールドleftが指しているノー
ドをLというラベルのエッジで表し、フィールドright
が指しているノードをRというラベルのエッジで表して
いる。DAGでは一つのノードが複数のノードから指さ
れることがあるため、DAGのノードを順番にたどった
ときに、異なるエッジをたどると同じノードに達する場
合がある。しかし、非巡回であるならば、あるノードか
らエッジに沿ってノードをたどったときに、再びそのノ
ードを訪れることはない。本発明によれば、手続き内の
みの解析でこのことを解析できる。
【0066】再帰呼び出しの停止条件を解析する際の処
理フローを図11に示す。図1との相違点を中心に、ど
のような処理が行われるかを説明する。
【0067】フロー解析(5)では、手続き呼び出し表
(31)を作成する。手続き呼び出し表(31)は図1
2に示すフィールドからなる。手続き呼び出し表は、解
析対象の手続きで呼び出される手続き毎に作成される。
呼び出される手続きには、自分自身も含まれる。図12
のプログラムでは自分自身の呼び出しがS43とS44
の二ケ所あるが、手続き呼び出し表は一つだけ作成され
る。フロー解析の際に、呼び出し先手続き(41)には
呼び出し先の手続き名dag_traversal()を設定する。実
引数(42)には、複数の呼び出しがある場合、それぞ
れの呼び出しの実引数の組からなるリストを設定する。
この例では二つの呼び出しがあるため、node->rightとn
ode->leftの二組の実引数が設定される。さらに、再帰
呼び出しの場合には、再帰呼び出しか(43)に真(T
RUE)または偽(FALSE)を設定する。この例で
は再帰呼び出しであるので、真を設定する。さらに、再
帰呼び出しの場合には、その呼び出しが行われないため
の条件を表す論理式を再帰呼び出し終了条件式(44)
に設定する。この例では、文S41のif文の条件が真の
時、再帰呼び出しが行われないので、node==NULLを
設定する。なお、この終了条件式は常に検出できるわけ
ではない。
【0068】フロー解析(5)で出力されるフロー情報
(6)には、手続き呼び出しによって値が書き換えられ
得る変数の集合が含まれるものとして説明する。文Sで
の手続きpの呼び出しによって、値が書き換えられ得る
変数の集合をMOD(p,s)で表す。
【0069】図9のプログラムでは、文43と文44で
のdag_traversal()の呼び出しで値の書き換えられ得る
変数は、自分自身への再帰呼び出しであることを考慮し
て、以下のように求められる。
【0070】 MOD(dag_traversal,S43)={node->value} MOD(dag_traversal,S44)={node->value} 停止性判定(32)では、再帰呼び出しが停止すること
が保証されるかどうかを、実行時オプションや指示文か
ら判断する。これらの情報は中間コード(4)に含まれ
ている。ここでは、ソースプログラム中に指示文で、関
数dag_traversal()の停止が保証されていることが記述
されていることにして、再帰呼び出し停止性(45)に
真を設定する。この指示文は、例えば次のようなもので
ある。
【0071】 #pragma TERMINATE dag_traversal これはC言語の前処理命令#pragmaを用いて、処理系に
dag_traversal()という手続きの停止性が保証されるこ
とを示している。
【0072】停止条件解析(33)では、再帰呼び出し
停止性(45)が真である手続きについて、その再帰呼
び出しの停止するための必要条件を解析する。再帰呼び
出し制御変数の検出(35)では、再帰呼び出しを行う
か否かを決定する変数を求める。
【0073】以下の三つの条件を満たす変数を、再帰呼
び出し制御変数とする。
【0074】条件1:再帰呼び出し終了条件式でその変
数の値が使用されている。
【0075】条件2:手続きの仮引数の値からその変数
の値が定まる。
【0076】条件3:再帰呼び出しの実引数の値がその
変数の値から定まる。
【0077】上記の条件を満たす変数を決定できなかっ
た場合は、以下の処理を行わない。図9の例で言うと、
仮引数nodeが上記の条件を満たすので、再帰呼び出し制
御変数(46)に設定する。
【0078】再帰呼び出し終了条件式の検査(36)で
は、再帰呼び出し終了条件式(44)の値が、再帰呼び
出し制御変数(46)と、手続き内で値が書き換えられ
ることのない変数の値のみから決定できるかどうかを調
べ、その条件を満たさない場合は以下の処理を行わな
い。図9の例で言うと、終了条件式node==NULLは制
御変数と定数のみからなるため、制御変数の値から決定
できる。
【0079】再帰呼び出し停止条件の解析(37)で
は、再帰呼び出しが有限回で停止するための必要条件を
求める。ただし、ここで言う再帰呼び出しの回数は、そ
の手続きの通算の呼び出し回数ではなく、同時に実行状
態にあるものの数である。一般に、制御変数をvar、手
続きのi回目の再帰呼び出しでのvarの値をvar(i)とす
る。ただし、着目している呼び出しでのvarの値をvar
(0)とする。var(0)が停止条件を満たしている場合は再
帰呼び出しは行われないため、var(0)では停止条件を満
たさないものとする。すると、ループの場合と同様の理
由から、var(0)!=var(i)、だだしi>0、であることが
停止条件となる。このことは、任意のノードから出発し
たエッジに沿ってノードをたどっていった時に、再び最
初のノードに達することがない、ということである。
【0080】図9のプログラムの停止条件をプログラム
中の変数を用いて表すと、以下のような無限個の不等式
が得られる。
【0081】node!=node->right node!=node->left node!=node->right->right node!=node->right->leftなど これらの不等式の右辺は正規表現を用いて、nodeの後に
->rightまたは->leftが1個以上連接されたもの全体の
ように表せる。正規表現は広く使用されているので、具
体的な表現方法は省略する。
【0082】以上から、次の三つの条件 条件1:再帰呼び出し制御変数がポインタである。
【0083】条件2:実引数が、制御変数をpとしたと
き*(p+c)の形式である(ただしcは定数)。実引数が
複数ある場合はcの値がそれぞれ異なっていても良い。
【0084】条件3:停止条件が、仮引数が特定のアド
レスでないことである。
【0085】を満たす場合に、停止条件(47)とし
て、p!=*(p+c)などの式を設定する。
【0086】フロー情報更新(38)では、再帰呼び出
し停止条件(47)が求められた時に、その停止条件が
満たされるものとしてフロー情報を更新する。図9の例
では、関数dag_traversal()の中で定義される変数はnos
e->valueのみであり、S43とS44から再帰的に呼び
出されるdag_traversal()では、呼び出し側のnodeとは
異なる値をnodeとすることから、これらの呼び出しによ
って呼び出し側のnode->valueの値が変更されることは
ないことがわかる。従って、手続き呼び出しによって値
が書き換えられ得る変数の集合、MOD(dag_traversa
l,S43)とMOD(dag_traversal,S44)はいず
れも空集合となる。
【0087】ここでは手続き内解析のみを行うものとし
て説明したが、手続き間解析を行うことにより、他の手
続きの呼び出しを含む場合でも同様の解析を行えるよう
になる場合がある。
【0088】以上述べてきた実施例はいずれもプログラ
ムの解析のみを行うものであった。以下ではこの解析結
果を利用して、プログラムの最適化を行う実施例を説明
する。
【0089】本発明を最適化コンパイラに適用した場合
の、コンパイラの処理フローを図13に示す。フロント
エンド(3)からフロー情報更新(14)までの処理は
図1や図11の場合と同様に行われる。最適化(51)
では、停止条件が成立するものとして解析されたフロー
情報(15)を利用して、中間コード(4)を最適化す
る。コード生成(52)では最適化された中間コード
(4)から目的コード(53)を生成する。この例で
は、既存の方法を利用して最適化を行うため、従来の最
適化方法と比べると、フロー解析の精度が向上すること
による目的コードの質の向上が期待できる。
【0090】図9のプログラムを例に従来の最適化との
違いを説明する。なお、目的コードとしては機械語プロ
グラムを生成するものとする。
【0091】従来のフロー情報(6)を用いて最適化を
行った場合に生成される機械語コードを図14に示す。
従来方式では次のようなコードが生成される。まず、文
S42は定数をレジスタにするコード(61)になる。
ここでGR1はnode->valueの値を保持するレジスタで
ある。文S43に対するコード(62)は、まず、引数
node->rightの値をロードし、引数レジスタARG0へ
設定する。そして、呼び出しの手続きでnode->valueの
値が読み込まれる可能性があるため、GR1をストアし
てから、手続きdag_traversal()を呼び出す。さらに、n
ode->valueの値と手続き呼び出しの戻り値を加えて新た
なnode->valueの値とする。このとき、手続き呼び出し
の際にnode->valueの値が書き換えられている可能性が
あるため、node->valueの値を再ロードする必要があ
る。文S44に対するコード(63)もS43と同様で
ある。最後に、node->valueの値をストアする(6
4)。
【0092】一方、本発明によって得られたフロー情報
(15)を用いて最適化を行った場合に生成される機械
語コードを図15に示す。図14のコードとの違いは、
文S43とS44に対応するの部分、即ち(72)と
(73)である。この場合には、手続き呼び出しによっ
てnode->valueの値が読み込まれたの書き込まれたりす
ることがないとわかっているため、node->valueの値を
ストアしたりロードしたりする必要がない。
【0093】本発明によって得られたフロー情報を利用
することにより、文S43とS44に対して、従来はそ
れぞれ5つの命令が生成されていたのが、3命令に削減
されている。これによって、命令数が減少すると共に、
実行時間の短縮が期待できる。
【0094】前記の実施例では、プログラムの停止性が
成り立つものとして最適化を行っていた。しかし、プロ
グラムによってはこの停止性が成り立つかどうかを実行
時に判定することができる。
【0095】停止性を実行時に判定する最適化を行うコ
ンパイラの処理フローを図16に示す。
【0096】フロントエンド(81)では、ソースプロ
グラムを読み込み、中間コード(82)を作成する。こ
のとき、図1のフロントエンド(3)とは異なり、停止
性を指定するための実行時オプションや指示文の処理を
行う必要はない。
【0097】フロー解析(83)では、中間コード(8
2)を読み込み、従来のフロー解析を行い、フロー情報
(84)を生成する。このとき作成されるループ表(8
5)には、ループ停止性のフィールドがないこと以外は
図1のループ表(7)と同一である。
【0098】フロー解析の後、停止性判定は行わずに、
停止条件解析(86)を行う。このとき、全てのループ
について停止性が仮定されているものとして、停止条件
を解析する。
【0099】フロー情報更新(87)では、従来のフロ
ー情報(84)に、ループ停止条件の求められた各ルー
プに対して、ループ停止条件が成立する場合のフロー情
報を解析し、従来のフロー情報に付加したフロー情報
(88)を出力する。
【0100】最適化(89)では、従来の最適化に加え
て、以下のような最適化を行う。まず、以下の条件を満
たすループを見つける。
【0101】条件1:停止条件が検出されている。
【0102】条件2:停止条件を満たすか否かを、ルー
プの実行前に調べることができる。
【0103】条件3:停止条件が成立するか否かで、フ
ロー情報に違いがある。
【0104】これらの条件に、フロー情報の違いによっ
て実施し得る最適化が異なる、ループの大きさ(命令
数)が大きすぎない、などの条件を付け加えることもで
きる。条件を満たすループを検出できたら、以下の手順
でコード変換を行う。条件分岐の生成(91)では、ル
ープの停止条件を満たすか否かを調べる条件分岐を作成
する。ループの複写(92)では、前記条件を満たすル
ープを複製し、前記条件分岐の分岐先のそれぞれがルー
プが実行されるようにする。フロー情報の複写(93)
では、複製されてできた二つのループのうち、ループ停
止条件を満たす時に実行されるループに対して、停止条
件が満たされる場合のフロー情報を求める。
【0105】上記の最適化を図8のループを例に説明す
る。図8のループの停止条件は、start<endである。こ
のループに対するフロー情報更新(87)では、停止条
件が成立するか否かによってフロー情報が変化すること
のみをループ表に論理値で記録することにする。
【0106】このループの停止条件が成り立つか否か
は、ループの実行前に調べることができる。また、停止
条件が成り立つことによってループ中でarray[start]の
値が変わらないことがわかるため、上記の条件1,2,
3を満たす。
【0107】図8のループに対して最適化を行った時の
プログラムを、図17にC言語で示す。これは、この様
な最適化は機械語コードを生成する時だけでなく、ソー
スプログラムから同じ言語で記述されたより実行性能の
良い目的コードを生成するような処理系でも実施できる
ことも示している。図17のラベルS51は文法的には
正しくないが、説明のために記した。図17で、文S5
1は条件分岐の生成(91)で生成された条件分岐であ
る。S51からS55までの型宣言及び文は、ループの
複写(92)でできた、停止条件を満たす時のコードで
ある。一方、S56からS57までの文は、停止条件を
満たさない時のコードである。フロー情報の更新(9
3)によって文S55ではarray[start]が定義されるこ
とがないとわかるため、array[start]*array[start]
という式がループ不変式として認識される。文S52で
ループの実行前に一度だけ個の式の値を求め、tmpとい
う変数に代入し、ループ内ではtmpの値を用いている。
これによって、停止条件を満たすならば、ループの繰り
返し毎にarray[start]*array[start]という計算をしな
くて済むため、実行時間が短縮されることが期待でき
る。また、停止条件を満たされない場合でも正しい実行
結果を得ることができる。
【0108】以上では本発明の最適化コンパイラへの適
用について説明した。次の実施例では、最適化以外にプ
ログラムの検証にも本発明が適用できることを示す。
【0109】図16の最適化方法では、ループの停止条
件が満たされない場合でも正しい結果が得られるように
コード変換を行った。しかし、図8のプログラムでは、
停止条件が満たされない場合には、ループを繰り返して
いるうちに制御変数iがint型で表せる値の最大値に達
してしまう。さらにiの値を増加させようとすると、実
行するシステムによって、オーバーフローによる割り込
みが発生したり、iの値が負数になったりする。このよ
うな場合には元のプログラムと同じ振舞をするとはい
え、プログラマの意図した結果ではないことが多い。そ
こで、停止条件を満たさない時は、診断メッセージを出
力するなどしてプログラマに意図しない状況が生じたこ
とを知らせると、プログラムの検証が行い易くなる。
【0110】本発明を利用することにより、最適化の一
種として、このような診断メッセージを出力するコード
を付け加えることができる。そのためのコンパイラは、
図13に示すような処理フローで実現できる。図13を
用いて説明した他の実施例との違いは、最適化(51)
において、停止条件を満たすものとしてコード変換を行
うだけでなく、停止条件を満たさない時に診断メッセー
ジを出力するコードを付け加えることである。
【0111】図18は図8のプログラムに対して上記の
最適化を行った例である。図18のラベルS61は文法
的に正しくないが、説明のために記した。停止条件star
t<endが成立すると仮定することにより、ループ不変式a
rray[start]*array[start]が検出される。S61,S6
3,S64,S65が最適化されたループである。さら
に、診断メッセージを出力するために、文S62を付け
加える。この文は、C言語の標準ライブラリの関数asse
rt()を用いることにより、停止条件が成り立たない時に
診断メッセージを表示してプログラムの実行を終える。
【0112】以上述べてきたように、本発明による静的
解析方法は、プログラムの静的解析を行うだけでなく、
最適化、並列化や検証に応用することができる。また、
プログラムが停止すると仮定して解析を行うだけでな
く、実行時に停止条件が満たされるかを判断することも
可能である。
【0113】
【発明の効果】本発明の効果の一つは、プログラムの静
的解析の精度が向上することである。解析精度が向上す
ることにより、プログラムの誤りを発見しやすくした
り、最適化や並列化の効果を高めることができる。もう
一つの効果は、従来の解析方法よりも少ない手間で同等
以上の精度の解析を行うことができることである。
【図面の簡単な説明】
【図1】静的解析方法の処理フローを示す図(1)であ
る。
【図2】リンクトリストをたどるループの例である。
【図3】リンクトリストのノード間の関係を示す図であ
る。
【図4】中間コードを示す図である。
【図5】ループ表の構成を示す図である。
【図6】番兵のいるリストをたどるループの例である。
【図7】番兵のいるリストのノード間の関係を示す図で
ある。
【図8】制御変数が整数型のループの例である。
【図9】DAGをたどる再帰呼び出しの例である。
【図10】DAGのノード間の関係を示す図である。
【図11】静的解析方法の処理フローを示す図(2)で
ある。
【図12】手続き呼び出し表の構成を示す図である。
【図13】最適化コンパイラの処理フローを示す図
(1)である。
【図14】従来方式によって生成されるコードを示す図
である。
【図15】本発明によって生成されるコードを示す図で
ある。
【図16】最適化コンパイラの処理フローを示す図
(2)である。
【図17】最適化を行った例(1)である。
【図18】最適化を行った例(2)である。
【符号の説明】
1…ソースプログラム。2…実行時オプション、3…フ
ロントエンド、4…中間コード、 5…フロー解
析、 6…フロー情報。

Claims (8)

    【特許請求の範囲】
  1. 【請求項1】プログラミング言語で記述されたプログラ
    ムを、実行すること無しに解析する方法であって、(a)
    ソースプログラムを読み込み、字句解析・構文解析・意
    味解析を行い中間コードを生成するフロントエンドと、
    (b)前記中間コードに対して制御の流れ及びデータの流
    れを解析してフロー情報を生成するフロー解析と、(c)
    プログラムを実行した時に必ず停止すると仮定して良い
    かどうかを判定する停止性判定と、(d)前記停止性判定
    でプログラムが停止すると判定された時、プログラムが
    停止するための必要条件を求める停止条件解析と、(e)
    前記停止するための必要条件が満たされるものとして、
    前記フロー情報を更新するフロー情報更新、の各ステッ
    プを含むことを特徴とするプログラムの静的解析方法。
  2. 【請求項2】前記ステップ(c)において、プログラム
    の全体または特定の範囲に含まれるコードの実行によっ
    てプログラムが停止しなくなる可能性があるか否かを、
    静的解析を行うシステムの実行時オプションとして与え
    ることを特徴とする、請求項1記載のプログラムの静的
    解析方法。
  3. 【請求項3】前記ステップ(c)において、プログラム
    の全体または特定の範囲に含まれるコードの実行によっ
    てプログラムが停止しなくなる可能性があるか否かを、
    解析対象となるソースプログラム中に記述された指示文
    によって与えることを特徴とする、請求項1記載のプロ
    グラムの静的解析方法。
  4. 【請求項4】前記ステップ(d)において、プログラム
    中のループに対して、(d1)ループの繰り返し毎に規則
    的に値が更新され、(d2)ループの終了条件式に使用さ
    れる、変数があるとき、その変数の値に関する制約を、
    そのループの停止する必要条件とすると、請求項1記載
    のプログラムの静的解析方法。
  5. 【請求項5】前記ステップ(d)において、プログラム
    中の手続きの再帰呼び出しに対して、(d1)再帰呼び出
    しの際の実引数が、呼び出し側の仮引数の値によって決
    定され、(d2)その再帰呼び出しを行うか否かが前記仮
    引数の値によって決定される、ことを特徴とする再帰呼
    び出しに対して、前記実引数及び仮引数の値に関する制
    約を、その再帰呼び出しが停止する必要条件とする、請
    求項1記載のプログラムの静的解析方法。
  6. 【請求項6】前記プログラムの静的解析方法は、さら
    に、(f)ステップ(e)で生成されたフロー情報を用い
    て中間コードをより小さいまたは効率良く実行できる中
    間コードへ変換する最適化と、(g)ステップ(f)で生
    成された中間コードから目的コードを生成するコード生
    成、の各ステップを含むことを特徴とする請求項1記載
    のプログラムの静的解析方法。
  7. 【請求項7】前記ステップ(d)及び(c)は、(d)ス
    テップ(c)で求められた条件が満たされるか否かを実
    行時に判定し、(d1)前記条件が満たされる時は、その
    条件が満たされるときのフロー情報に基づいて最適化を
    行ったコードを実行し、(d2)前記条件が満たされない
    時は、診断メッセージを出力する、ように中間コードの
    変換を行うことを特徴とする最適化と、(e)ステップ
    (d)で生成された中間コードから目的コードを生成す
    るコード生成、の各ステップを含むことを特徴とする請
    求項1記載のプログラムの静的解析方法。
  8. 【請求項8】前記ステップ(c),(d)、及び(e)
    は、(c)プログラムが停止するとした時に成立する条件
    を求める停止条件解析と、(d)ステップ(c)で求めら
    れた条件が満たされるか否かを実行時に判定し、(d1)
    前記条件が満たされる時は、その条件が満たされるとき
    のフロー情報に基づいて最適化を行ったコードを実行
    し、(d2)前記条件が満たされない時は、その条件が満
    たされるか否かは不明である時のフロー情報に基づいて
    最適化を行ったコードを実行する、ことを特徴とする中
    間コードの変換を行う最適化と、(e)ステップ(d)で
    生成された中間コードから目的コードを生成するコード
    生成、の各ステップを含むことを特徴とする請求項1記
    載のプログラムの静的解析方法。
JP8087940A 1996-04-10 1996-04-10 プログラムの静的解析方法 Pending JPH09282173A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP8087940A JPH09282173A (ja) 1996-04-10 1996-04-10 プログラムの静的解析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP8087940A JPH09282173A (ja) 1996-04-10 1996-04-10 プログラムの静的解析方法

Publications (1)

Publication Number Publication Date
JPH09282173A true JPH09282173A (ja) 1997-10-31

Family

ID=13928907

Family Applications (1)

Application Number Title Priority Date Filing Date
JP8087940A Pending JPH09282173A (ja) 1996-04-10 1996-04-10 プログラムの静的解析方法

Country Status (1)

Country Link
JP (1) JPH09282173A (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007179488A (ja) * 2005-12-28 2007-07-12 Fujitsu Ltd ソースコード問題予測プログラム
WO2011151931A1 (ja) * 2010-06-02 2011-12-08 株式会社日立製作所 アプリケーションの解析方法、解析システム及び記録媒体
CN102629213A (zh) * 2012-02-21 2012-08-08 北京经纬恒润科技有限公司 一种c语言仿真模型的剖析及监控方法
JP2013117803A (ja) * 2011-12-02 2013-06-13 Hitachi Ltd トレース情報の数を算出する計算機、トレース情報の数を算出する方法及びトレース情報の数を算出させるプログラム
JP2019125055A (ja) * 2018-01-12 2019-07-25 カシオ計算機株式会社 電子機器、表示制御方法、およびプログラム

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007179488A (ja) * 2005-12-28 2007-07-12 Fujitsu Ltd ソースコード問題予測プログラム
WO2011151931A1 (ja) * 2010-06-02 2011-12-08 株式会社日立製作所 アプリケーションの解析方法、解析システム及び記録媒体
US8898649B2 (en) 2010-06-02 2014-11-25 Hitachi, Ltd. Application program analysis method, analysis system and recording medium for identifying a contributing factor for an invalid operation of an application program
JP2013117803A (ja) * 2011-12-02 2013-06-13 Hitachi Ltd トレース情報の数を算出する計算機、トレース情報の数を算出する方法及びトレース情報の数を算出させるプログラム
CN102629213A (zh) * 2012-02-21 2012-08-08 北京经纬恒润科技有限公司 一种c语言仿真模型的剖析及监控方法
CN102629213B (zh) * 2012-02-21 2015-02-04 北京经纬恒润科技有限公司 一种c语言仿真模型的剖析及监控方法
JP2019125055A (ja) * 2018-01-12 2019-07-25 カシオ計算機株式会社 電子機器、表示制御方法、およびプログラム

Similar Documents

Publication Publication Date Title
Tristan et al. Evaluating value-graph translation validation for LLVM
US5978588A (en) Method and apparatus for profile-based code placement using a minimum cut set of the control flow graph
US7865778B2 (en) Method and system for detecting synchronization errors in programs
US6553362B2 (en) Case-reduced verification condition generation system and method using weakest precondition operator expressed using strongest postcondition operators
Sankar et al. Concurrent runtime monitoring of formally specified programs
JPH05257709A (ja) 並列化判別方法およびそれを用いた並列化支援方法
KR100188499B1 (ko) 인터프로시쥬어 데이타 흐름 분석 방법
US20070006192A1 (en) Intermediate representation for multiple exception handling models
JP2001166949A (ja) シンボリック実行を用いてソースコードをコンパイルするための方法及び装置
US20020166115A1 (en) System and method for computer program compilation using scalar register promotion and static single assignment representation
US6539543B1 (en) Method and apparatus for compiling source code by flattening hierarchies
JP6357814B2 (ja) 未完成ソフトウェアの分析
US7917899B2 (en) Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus
Puschner Transforming execution-time boundable code into temporally predictable code
JPH09282173A (ja) プログラムの静的解析方法
US10761820B2 (en) Assisting parallelization of a computer program
US20170206068A1 (en) Program optimization based on directives for intermediate code
Muller et al. Modeling and analyzing evaluation cost of CUDA kernels
Saha et al. On the fly mhp analysis
Fesefeldt et al. Automated checking and completion of backward confluence for hyperedge replacement grammars
JP3551352B2 (ja) ループ分割方法
JP2956591B2 (ja) ループ外への条件付き飛び出しがあるループの並列化方法及び装置
US20080282237A1 (en) Method and Apparatus For Generating Execution Equivalence Information
Darabi et al. A verification technique for deterministic parallel programs (extended version)
Jeon et al. SolQDebug: Debug Solidity Quickly for Interactive Immediacy in Smart ContractDevelopment