Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report

プログラム実行履歴を用いたコードクローン検出手法
井岡 正和1,a)

吉田 則裕2,b)

井上 克郎1,c)

概要：コードクローンとは，ソースコード中に存在する互いに一致または類似したコード片のことである．
コードクローンを検出する手法が，既存研究で数多く提案されている．しかし，既存手法では，プログラ
ムのソースコードやバイナリファイルといった静的な情報のみを使用してコードクローンを検出している．
そのため，ソースコードをコピーした後に難読化等の変更が施されると，剽窃が隠蔽されてしまうことがある．そこで，本研究では，プログラムの動的な情報である実行履歴を複数のフェイズに分割し，各フェイズのメソッド呼び出し列を比較することで，コードクローンを検出する手法の提案を行う．提案手法を
実際のアプリケーションに適用した結果，難読化前後で同一のコンポーネントを識別できることと，再利用されている箇所を特定できることを確認できた．
キーワード：コードクローン検出，動的解析，難読化

Code Clone Detection Technique Using Program Execution Traces
Masakazu Ioka1,a)Norihiro Yoshida2,b)Katsuro Inoue1,c)Abstract: Code clone is a code fragment that has identical or similar fragments to it in the source code.
Many code clone detection techniques and tools have been proposed. However, source code derived bycopy-and-paste may be disguised by obfuscation because these techniques detect code clone using only static
information such as source code or binary. Therefore, we propose a new clone detection technique, which
divides execution trace into a set of phases, and then performs the comparison of those phases based on
involved method calls. The experimental result shows that the proposed clone detection technique identified
obfuscated and original classes, and an evidence of reusing source code.
Keywords: Code Clone Detection, Dynamic Analysis, Obfuscation

1. はじめにライセンスを無視したソフトウェアのコピーやソースコー
ドの再利用が年々増加している．このため，コードクロー

ソフトウェア工学における研究対象として，コードク

ンを自動的に検出する手法が数多く提案されている [3]．

ローンが注目されている．コードクローンとは，ソース

一方で，プログラムの解析を困難にする難読化技術がコード中に存在する互いに一致または類似したコード片の次々と提案されている [11]．この技術によって，プログラことをいい，主にコピーアンドペーストによって生成されム中に含まれる特定の情報を隠蔽することができる．そのる．一般的に，コードクローンは，ソフトウェアの保守性ため，ライセンスを無視したソフトウェアのコピーといっを悪化させる要因の 1 つであると考えられている．また，た剽窃が隠蔽される恐れがある．プログラムに難読化が施

1

されると，多くの既存手法が使用しているプログラムの

2

a)
b)
c)

大阪大学
Osaka University
奈良先端科学技術大学院大学
Nara Institute of Science and Technology
m-ioka@ist.osaka-u.ac.jp
yoshida@is.naist.jp
inoue@ist.osaka-u.ac.jp

c 2012 Information Processing Society of Japan⃝

ソースコードやバイナリファイルといった静的な情報のみ
では，コードクローンを検出することが難しい．
そこで，本研究では，プログラムの動的な情報である実行履歴からコードクローンを検出する手法を提案する．提1

Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report

案する手法は，2 つのプログラムの実行履歴を与えると，実ンを取り除くことや，些細な表現上の違いを吸収する

行履歴を機能的なまとまりであるフェイズに分割し，フェためにトークン列を変換する．例えば，変数名は同一イズ間の類似度を計算して類似度の高いものをコードクのトークンに置換されるので，変数名が違うコード片

ローンとして出力する．

もコードクローンとして判定することができる．

適用例では，実際のアプリケーションに提案手法を適用

STEP3(検出処理) トークン列の中から，指定された長し，難読化前後で同一のコンポーネントを識別できること

さ以上一致している部分をコードクローンとしてすべと，再利用されている箇所を特定できることを確認した．

て検出する．

以降，2 章では本研究に関連する用語の説明を行う．3
章では提案手法であるプログラム実行履歴からコードク

STEP4(出力整形処理) 検出したコードクローンのソー
スコード上の位置情報を出力する．

ローンを検出する手法について述べ，4 章では実際のアプ
リケーションに提案手法を適用した結果を述べる．5 章では関連する手法を提案している研究について議論し，最後に 6 章でまとめと今後の課題について述べる．

2. 背景

2.2 実行履歴の抽出プログラムの実行履歴は，実行時のオブジェクトの振る舞いを記録したもので，実行されたイベントが時系列順に並んでいる．イベントは，実行されたオブジェクト間のメッセージ通信イベントであり，実行時刻やメッセージを

2.1 コードクローンとその検出送信したオブジェクトと受信したオブジェクト，メッセー

2.1.1 コードクローン

ジの内容等の情報を保持している [13]．

コードクローンとは，ソースコード内の同一または類似プログラムの実行履歴を抽出する方法の 1 つとしてするコード片のことをいう [1]．コードクローンは，主にAmida[12] がある．Amida のプロファイラ機能は，Java プ

既存コードのコピーアンドペーストや，定型処理の記述にログラムを動的解析し，実行時のイベントを実行履歴としよって生成される [6]．一般的に，コードクローンは，ソフて記録するものである．イベントとしては，メソッドの呼トウェアの保守性を悪化させる要因の 1 つであると考えら

び出し，復帰やフィールドの参照，定義等を検出すること

れている．

ができる．

2.1.2 コードクローン検出手法
コードクローンを検出する手法が，既存研究で数多く提2.3 フェイズ分割手法

案されている [4], [5], [7], [9], [10], [14]．コードクローン検

渡邊らは，1 つの実行履歴を複数のフェイズに分割する

出手法は，プログラムの品質管理やプログラムの剽窃検出手法を提案している [13]．フェイズとは，実行履歴上からに利用されている．また，これらのコードクローン検出手

切り出された連続するイベント列のうち，“入出力処理” や法は，コードクローンの検出単位によって，大まかに以下“データベースアクセス” 等といった，開発者にとって意味の 5 つに分類することができる．

のある処理に対応するものを指す．

• 行単位の検出

オブジェクト指向プログラムは，1 つの機能を実行する• 字句単位の検出際に多数の中間データ用のオブジェクトを生成し，その• 抽象構文木を用いた検出機能の実行が終了した時点でそれらのオブジェクトの大• プログラム依存グラフを用いた検出半を破棄するという性質を持っている [8]．そのため，メ• メトリクスやフィンガープリント等，その他の技術をソッド呼び出しイベントに関わったオブジェクトを Least

用いた検出
この分類において，上に記述したものほど高速にコードクローンを検出でき，下に記述したものほど差分を含んだ
コードクローン等の多様なコードクローンを検出することができる．

Recently Used (LRU) キャッシュに登録していくことで，キャッシュの更新頻度からあるフェイズが終了し次のフェイズが開始したことを検知することができる．
また，このアルゴリズムは入力する実行履歴のサイズにほぼ比例した時間コストで計算可能である．

ここでは，コードクローン検出手法の例として，字句単位の検出にあたる CCFinder[5] について述べる．CCFinder

2.4 難読化技術

は，プログラムのソースコード中に存在する極大クローン

難読化とは，あるプログラムを理解が困難な等価なプを検出し，その位置を出力する．この手順は，以下の 4 つ

ログラムに変換することである [11]．難読化を施すことにのステップからなる．

よって，プログラムを不正な解析から保護することができ

STEP1(字句解析) ソースコードを字句解析し，トークる．一方で，不正にコピーしたプログラムに難読化を施す

ン列に変換する．

STEP2(変換処理) 実用上意味を持たないコードクロー

c 2012 Information Processing Society of Japan⃝

ことによって，剽窃が隠蔽される恐れがある．
難読化には様々な技術が存在するが，ここでは，名前変2Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Reportのとする．
!"#$$%&#'(")%*+%%(,-.#/)%.0-1%(,-2/3&/,-24%'$45%*+%%%%66%78+%%9+%%(:;"-!%.0-1%$0')/<-2435%*+%%%%(,-2/3=>)""0?5@+
%%9+
9+
+
!"#$$%AB%*+
9+

!"#!

!"#$$%C%*+%%(,-.#/)%.0-1%#3&/,-24%#5%*+%%%%66%78+%%9+%%(:;"-!%.0-1%;35%*+%%%%#3=>)""0?5@+
%%9+
9+
+
!"#$$%D%*+
9+

提案手法の概要を図 2 に示す．提案手法は，以下の手順からなる．

(1) フェイズ分割 与えられたプログラムの実行履歴をフェイズに分割．

(2) 正規化 各フェイズのメソッド呼び出しを正規化．
(3) フェイズ比較 動的計画法を用いて各フェイズを比較．
以降，各手順について詳述する．

!%#!

!$#!

3.1 フェイズ分割
与えられたプログラムの実行履歴を，渡邊らのフェイズ!"#$$%&#'(")%*+%%(,-.#/)%.0-1%(,-2/3&/,-24%'$45%*+%%%%66%78+%%9+%%(:;"-!%.0-1%$0')/<-2435%*+%%%%66%78+
%%9+
9+
+
!"#$$%AB%*+9+

図 1!"#$$%&#'(")%*+%%(:;"-!%.0-1%$0')/<-2435%*+%%%%ABE(,-2/3/<-$F%=>)""0?5@+
%%9+
9+
+
!"#$$%AB%*+%%(:;"-!%$/#/-!%.0-1%(,-2/3&#'(")%#F%&/,-24%'$45%*+%%%%66%78+
%%9+
9+

難読化の例

Fig. 1 An example of obfuscations

分割手法 [13] を用いて複数のフェイズに分割する．このとき，フェイズの長さが短いものは異なる処理のフェイズであってもメソッド呼び出し列が重複しやすいので，フェイズの長さが閾値未満のものを検出対象から除外する．

3.2 正規化
各フェイズについて 2 種類の正規化を行う．

1 つ目は，メソッド呼び出し列の正規化である．メソッ
ド呼び出しの繰り返し回数に意味を持たないことが多いの

換，メソッド分散，インライン展開について述べる．

で，2 回以上のメソッド呼び出しは 2 回のメソッド呼び出

名前変換 対象クラスに含まれるシンボル名 (クラス名，

しとする．

フィールド名，メソッド名等) の定義を変更し，意味

2 つ目は，メソッド呼び出しシグネチャの正規化である．

のない名前にする技術である．定義を変更するため，難読化等によってメソッドのシグネチャが意味を持たなシステムが提供する API に含まれる名前を変更する

いことが多いので，メソッド呼び出し内の出現位置情報をことはできない．例を図 1 (a) に示す．例ではシンボ使ってインデックスを振る．メソッド呼び出しの正規化は

ル名を a，b 等に変換している．

以下の 2 つの方法で行う．

メソッド分散 対象クラスの集合からランダムに選択した

正規化 1 (1 つの呼び出し内だけで正規化) 1 つのメソッ

メソッドを別のクラスに移動する技術である．例を図

ド呼び出し内だけでインデックスを振る．例を図 3 に

1 (b) に示す．呼び出されるメソッドの修飾子を public

示す．「メソッド A(型 X, 型 Y); メソッド B(型 Z, 型

static にし，呼び出す側はこのメソッドを静的に呼びZ); メソッド C(型 W, 型 Z);」のそれぞれの呼び出し出すように変更している．また，移動したメソッドかでインデックスを振るので，「0(1, 2); 0(1, 1); 0(1, 2)」

ら移動元クラスのフィールドを参照できるように，引となる．

数に移動元のオブジェクトを渡すように変更している．

正規化 2 (直前の呼び出しと現在の呼び出しで正規化)

インライン展開 対象クラスの集合からランダムに選択しあるメソッド呼び出しを正規化する際，直前のメソッ

たメソッド呼び出しにそのメソッドのコードを展開す

ド呼び出しを含めてインデックスを振る．例を図 4 にる技術である．例を図 1 (c) に示す．例では，some-示す．メソッド A の呼び出しについては，直前にメ

thing メソッド内の print メソッドの呼び出しに，print

ソッド呼び出しがないので，メソッド A の呼び出し内メソッドのコードを展開している．

だけでインデックスを振り「0(1, 2);」となる．メソッ

3. 提案手法

ド B の呼び出しについては，直前のメソッド呼び出し
であるメソッド A を含めてインデックスを振るので，本稿では，2 つのプログラム実行履歴を与えると，その 2

メソッド B の呼び出しは「3(4, 4);」となる．メソッ

つの実行履歴からコードクローンを検出する手法を提案す

ド C の呼び出しについても同様で「2(3, 1);」となる．

る．この手法では，プログラムの実行履歴を対象としてい正規化 1 では，不要なメソッド呼び出しの追加等のメるため，プログラムを難読化された場合でもコードクロー

ソッド呼び出しの改変の影響をあまり受けないが，誤検出

ンを検出することができる．なお，プログラムの実行履歴が多くなる恐れがある．正規化 2 では，メソッド呼び出し

は，イベントとして “メソッドの呼び出し” と “New 演算の改変の影響を少し受けるが，正規化 1 よりも誤検出が少(コンストラクタの呼び出し)” を取得したものを与えるもない．

c 2012 Information Processing Society of Japan⃝3

Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report<=8>*+?,-.<=8>/+-.@@@,-./0$,-./0$,-./0%,-./0%,-./0%,-./0%,

!
!
!

!
!
!

!
!
!
,

!
!
!

-./0(,-./0),-./0(,-./0),

#$,

#%,

#$,

#%,

$'"-./0:;,#%,%'"ABC,,-./0$,,#$,-./0$,,!"!"#$%&'()*+,

0+$-.0.@@@,
3"!"()*+4$56789,&'"-./012,

図 2 提案手法の概要

Fig. 2 An overview of the proposed approach!"#$!"%#$%%&'&!"#$+"%,$%,&'&!"#$-"%.$%,&'&

実際のアプリケーションに対して適用した．なお，フェイ
ズの長さの閾値は 50 とし，メソッド呼び出しの正規化は正規化 2 を適用した．適用対象は ICCA*1 の Gemini コン

(

)

*

(

)

)

(

)

*

図 3 1 つのメソッド呼び出し内だけで正規化の例

ポーネントと Virgo コンポーネントとし，以下の 2 点を調査の目的とした．

Fig. 3 An example of normalization within one method call

• 難読化前後で同一のコンポーネントを識別できるか．
• 再利用されている箇所を特定できるか．

!"#$!"%#$%%&'&

なお，難読化には，ProGuard*2 を標準設定で使用した．
また，各コンポーネントについて，起動からクローンデー()

タの解析完了までの実行履歴を取得した．

*!"#$!"%#$%%&'&!"#$+"%,$%,&'&

4.1 クラス・メソッド単位のクローン
3.3 節で述べたフェイズの比較によって，フェイズ間でメ
(

)

*

-

.

.

ソッド呼び出しが対応付いている．この対応付いたメソッ!"#$+"%,$%,&'&!"#$/"%0$%,&'&

ド呼び出しから，クラス A とクラス B の類似度を以下の式により定義する．

(
図 4

)

)

*

-

)

直前の呼び出しと現在の呼び出しで正規化の例

similarity(A, B) =2 × (A と B が対応付いているメソッド呼出数)
A 内のメソッド呼出数 + B 内のメソッド呼出数

Fig. 4 An example of normalization according to current andprevious method calls

3.3 フェイズ比較
動的計画法を用いた類似文字列マッチングアルゴリズ
ム [15] を使用してフェイズの比較を行う．入力として 2 つまた，この式のクラス A，クラス B をメソッド A，メ
ソッド B に置き換えた式をメソッド間の類似度として定義
する．

の文字列を与え，一方の文字列に，1 文字削除，1 文字挿Gemini コンポーネント，Virgo コンポーネントをそれぞ

入，1 文字置換という 3 つの操作を最低何回行ってもう一れ ProGuard を用いて難読化し，オリジナルとのクラス間方と同一の文字列へと変化させられるかを調べることで，の類似度，メソッド間の類似度を計算した．結果を図 5，6

2 つの文字列の類似度を求めることができる．

に示す．このグラフは，類似度に応じたクラス数，メソッ

本手法で使用するために，1 メソッド呼び出しを 1 文字

ド数の累積率を表している．また，Gemini コンポーネントに対応付けてこのアルゴリズムを適用する．このアルゴリの難読化前後のクラス間類似度に関するヒートマップを図

ズムを用いた場合，フェイズ間のメソッド呼び出しの対応

7 に示す．この結果より，Gemini コンポーネント，Virgo

関係を得ることができる．

コンポーネント共に，難読化を施してもクラス，メソッド

フェイズの比較を行った後，フェイズ間の類似度が高いをオリジナルと対応付けることができていることが分かる．

ものからグリーディに対応付けていき，クローンとして出Virgo コンポーネントについて，対応付けが正しいかど

力する．

4. 適用例

うかを確認したところ，すべての対応付けが正しいことが分かった．また，クラス間やメソッド間の類似度があまり*1

提案手法の有効性を確認するために，提案手法を実装しc 2012 Information Processing Society of Japan⃝*2

ICCA: http://sel.ist.osaka-u.ac.jp/icca/
ProGuard: http://proguard.sourceforge.net/

4Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report

4.2 類似したフェイズの調査(#$"

Gemini コンポーネントと Virgo コンポーネントに対し("て，類似したフェイズがどのような特徴を持っているか!#'"調査した．調査した組み合わせは，Gemini コンポーネン!
" !#&"#$!#%"-./010"トと Virgo コンポーネント (ケース 1)，Gemini コンポー

20345"

ネントと Virgo コンポーネントを難読化したもの (ケース2)，Gemini コンポーネントを難読化したものと Virgo コ!#$"

ンポーネント (ケース 3)，の 3 つのケースである．

!"!"!#(" !#$" !#)" !#%" !#*" !#&" !#+" !#'" !#,"("

各ケースの類似フェイズの検出結果を表 1 に示す．検出!"#$数は，ケース 3 のみ少なくなっている．これは，ProGuard
図 5による難読化では各フェイズの長さがオリジナルよりも短

難読化前後のクラス間類似度

Fig. 5 Similarity between obfuscated and original classes

くなるという特徴があり，規模の大きな Gemini コンポー
ネントは影響を受けやすかったためであると考えられる．
最大類似度については，すべてのケースで 1.00 となってい(#$"る．Gemini コンポーネントと Virgo コンポーネントでは，("共通のライブラリである iccalib を使用している．このラ!#'"イブラリ内のメソッドで始まるフェイズが完全に一致して!
" !#&"#$

いたため，類似度が 1.00 となっていた．一方，最小類似度-./010"!#%"については，ケース 3 が非常に小さい値となっている．こ20345"

れは，Gemini コンポーネントには多くのメソッドが存在!#$"

し，ProGuard による難読化によって，メソッド呼び出し!"!"!#(" !#$" !#)" !#%" !#*" !#&" !#+" !#'" !#,"の構造の変化が大きかったためであると考えられる．最後

("

!"#$

に，平均類似度については，ケース 3 の値が少し高くなっているがほぼ同じ値となった．

図 6

難読化前後のメソッド間類似度

また，iccalib 内のメソッド以外で始まるフェイズにつFig. 6 Similarity between obfuscated and original methods

いて，どのようなフェイズが類似しているかを確認した．
ケース 2 における類似フェイズで，Gemini コンポーネン

'(+

*'(+

)''(+

ト内のフェイズではファイルからクローン情報を取得して解析しており，また，Virgo コンポーネント内のフェイズ!"#$%$

ではクローンセットからクローン情報を取得して解析していた．Virgo コンポーネントは，Gemini コンポーネントよ!
"#り後に開発されているので，Gemini コンポーネントのプ

$

$
"
%
&
'
(
)
*
+
,
.

ログラムを再利用して Virgo コンポーネントを作成したと考えられる．この類似フェイズは付録に添付している．
以上のことより，再利用されている箇所を特定できることを確認できた．

+

5. 関連研究!"#$%$!"#$%"&'()*&

図 7

難読化前後のクラス間類似度に関するヒートマップ

Fig. 7 Heat map of similarity between obfuscated and originalSæbjørnsen らは，バイナリファイルからコードクロー
ンを検出する手法を提案している [10]．この手法は，バイ
ナリをディスアセンブルし，そのアセンブラの特徴を比較

classes
表 1 類似フェイズの検出結果

高くないものが存在するのは，難読化によってメソッドがTable 1 Detection result of similar phases

インライン展開され，メソッド呼び出しの構造が変化したことが原因であると分かった．
このことより，難読化前後で同一のコンポーネントを識別できることを確認できた．

c 2012 Information Processing Society of Japan
⃝

検出数

最大類似度

最小類似度

平均類似度

ケース 1

75

1.00

0.227

0.612

ケース 2

75

1.00

0.192

0.612

ケース 3

61

1.00

0.048

0.632

5

Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report

してコードクローンを検出する．そのため，ソースコード

参考文献

に対して行うコードクローン検出では検出できないコード[1]

クローンを検出することができる．しかし，逆に見つけることができないコードクローンも存在する．

[2]

Lim らは，制御フローグラフを用いた静的な Java プロ
グラムの盗用検出手法を提案している [9]．この手法では，Java バイトコードから制御フローグラフを作成し，プログ[3]

ラムが実行しうるパスを比較してコードクローンを検出している．そのため，単純なソースコードの比較やバイナリ[4]の比較では検出できなかったコーロクローンを検出することができる．また，静的な情報のみを使用しているので，[5]プログラム全体をカバーすることが容易である．
これらの既存手法と比較すると，提案手法は，より実際の振る舞いを考慮したコーロクローン検出ができるという[6]利点がある．しかし，提案手法では，プログラムの実行履
歴を使用するため，実行環境の構築 (プログラムへの入力[7]等) が必要となり，プログラム全体を対象にしたコードク
ローン検出が困難である．

[8]

また，提案手法と同じプログラムの実行履歴を比較して類似した箇所を可視化する手法を，Cornelissen らが提案し[9]ている [2]．この手法は，プログラムの実行履歴の新しい見識を得てプログラム理解を容易にすることを目的としており，2 つの実行履歴を比較して，呼び出し元，呼び出し先，[10]

シグネチャ，ランタイムパラメータのすべてが同じものを一致とみなし，その結果をスキャッタープロットで可視化[11]している．一方，提案手法では，2 つの実行履歴を機能的なまとまりであるフェイズに分割，正規化した後，各フェイズを動的計画法を用いて比較し，クラスのクローン，メ[12]

ソッドのクローンをヒートマップで可視化している．
[13]

6. まとめと今後の課題
本稿では，プログラムの実行履歴をフェイズに分割し，[14]

各フェイズのメソッド呼び出し列を比較することで，コー
ドクローンを検出する手法を提案した．そして，実際のア
プリケーションに提案手法を適用して，その有効性を確認

[15]

した．
今後の課題として，まず，メソッド呼び出しの正規化を改善することが挙げられる．メソッド呼び出しの正規化を改善することによって，複数メソッドにまたがるクローンI. D. Baxter, A. Yahin, L. Moura, M. S. Anna, and
L. Bier. Clone Detection Using Abstract Syntax Trees.
In Proc. of ICSM 1998, pp. 368–377, 1998.
B. Cornelissen and L. Moonen. Visualizing similarities
in execution traces. In Proc. of PCODA 2007, pp. 6–10,
2007.
肥後芳樹, 楠本真二, 井上克郎. コードクローン検出とその関連技術. 電子情報通信学会論文誌, Vol. J91-D, No. 6,
pp. 1465–1481, 2008.
L. Jiang, G. Misherghi, Z. Su, and S. Glondu.
DECKARD: Scalable and accurate tree-based detectionof code clones. In Proc. of ICSE 2007, pp. 96–105, 2007.
T. Kamiya, S. Kusumoto, and K. Inoue. CCFinder: A
multilinguistic token-based code clone detection system
for large scale source code. IEEE Trans. Softw. Eng.,
Vol. 28, No. 7, pp. 654–670, 2002.
M. Kim, L. Bergman, T. Lau, and D. Notkin. An Ethnographic Study of Copy and Paste Programming Practices
in OOPL. In Proc. of ISESE 2004, pp. 83–92, 2004.
J. Krinke. Identifying similar code with program dependence graphs. In Proc. of WCRE 2001, pp. 301–309,
2001.
H. Lieberman and C. Hewitt. A real-time garbage collector based on the lifetimes of objects. Communicationsof the ACM, Vol. 26, No. 6, pp. 419–429, 1983.
H. Lim, H. Park, S. Choi, and T. Han. A method for
detecting the theft of Java programs through analysis of
the control flow information. Information and Software
Technology, Vol. 51, No. 9, pp. 1338–1350, 2009.
A. Sæbjørnsen, J. Willcock, T. Panas, D. Quinlan, andZ. Su. Detecting code clones in binary executables. In
Proc. of ISSTA 2009, pp. 117–128, 2009.
玉田春昭, 中村匡秀, 門田暁人, 松本健一. Java クラスファ
イル難読化ツール DonQuixote. 日本ソフトウェア科学会
FOSE 2006, pp. 113–118, 2006.
谷口考治, 石尾隆, 神谷年洋, 楠本真二, 井上克郎. プログ
ラム実行履歴からの簡潔なシーケンス図の生成手法. コン
ピュータソフトウェア, Vol. 24, No. 3, pp. 153–169, 2007.
渡邊結, 石尾隆, 井上克郎. 協調動作するオブジェクト群の変化に基づく実行履歴の自動分割. 情報処理学会論文
誌, Vol. 51, No. 12, pp. 2273–2286, 2010.
R. Wettel and R. Marinescu. Archeology of code duplication: recovering duplication chanins from small duplication fragments. In Proc. of SYNASC 2005, pp. 63–70,
2005.
R. B. Yates and B. R. Neto. Modern Information Retrieval. Addison Wesley, 1999.

付

録

A.1 類似フェイズの検出や，難読化によるインライン展開等のメソッド呼び出し構造の変化に対応することが可能となる．また，提案
手法を定量的に評価することも今後の課題である．
謝辞

4.2 節で述べた，再利用されているフェイズを図 A·1 に示す．

本研究は，日本学術振興会科学研究費補助金基盤

研究 (A) (課題番号: 21240002)，基盤研究 (C) (課題番号:

22500026) の助成を得た．

c 2012 Information Processing Society of Japan⃝

6

Vol.2012-SE-178 No.13
2012/11/2

情報処理学会研究報告
IPSJ SIG Technical Report!"#$%$&'()*'+."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":@@@@@@@@@@@@@@@@@@A."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":4B-96!-/8=>"=9-9</-7C,$-./&'()*'+0123
5$-./4949A$;;9:$D4B9<94E$:"4F$:"G%E/4."<HIJC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":@@@@@@@@@@@@@@@@@@A."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":4."<>;9:"K9<$/C."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A."#$%$4B9<94E$:"4GLG%B"MN9=4."<F$:"C@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-4."<HIJC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A."#$%$4B9<94E$:"4GLG%B"MN9=4."<F$:"C@$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-4."<J/B"F-9.#"%<7C@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A."#$%$4B9<94E$:"4F$:"IEE7"<L9<94."<C@$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-4."<J/B"F-9.#"%<7C@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A."#$%$4B9<94E$:"4F$:"IEE7"<L9<94."<C@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-4;-"9<"J/B"F-9.#"%<7C@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94E$:"4F$:"G%E/4."<!-/8=GLC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A$;;9:$D4B9<94E$:"4F$:"G%E/4."<PIJC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":@@@@@@@@@@@@@@@@@@A."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":4."<Q/6"-Q"%.<OC
RRR$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94;:/%"4J:/%"N9%9."-4."<F$:"J/B"F-9.#"%<7C@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A."#$%$4B9<94E$:"4F$:"IEE7"<L9<94."<C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N"<-$;7N9%9."-A$;;9:$D4B9<94E$:"4F$:"G%E/4."<F$:"GLC@

RRR."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A$;;9:$D4B9<94E$:"4F$:"N9%9."-4."<Q97<F$:"C@
RRR$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-A$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-A$;;9:$D4B9<94E$:"4F$:"N9%9."-4."<F$:"C@$;;9:$D4B9<94E$:"4F$:"N9%9."-A$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@."#$%$45$"645$789:47;9<<"-=:/<4>;9<<"-?:/<?9%":A$;;9:$D4B9<94E$:"4F$:"G%E/4."<!-/8=GLC@
RRR$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4;/#=9-"P/C@
RRR$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<!-/8=GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4;/#=9-"P/C@
RRR$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"UA$;;9:$D4B9<94E$:"4F$:"N9%9."-SF$:"T"U4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<F$:"GLC@$;;9:$D4B9<94E$:"4F$:"G%E/A$;;9:$D4B9<94E$:"4F$:"G%E/4."<?9<OC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/A$;;9:$D4B9<94;:/%"4J/B"F-9.#"%<G%E/4."<!-/8=GLC@

図 A·1 検出類似フェイズの例

Fig. A·1 An example of detected pair of similar phasesc 2012 Information Processing Society of Japan⃝

7