- qwik.jp

ICSEʼ’14勉強会 (2014年年7⽉月22⽇日)
担当者: ⽊木津 栄⼆二郎郎 ([email protected])
Y1
Manual Refactoring Changes With Automated Refactoring Valida8on
Xi Ge, Emerson Murphy-­‐Hill
目的
手作業によるリファクタリングを 短い時間で正確に出来るようにする
貢献
本手法,GhostFactorの提案と実装 8人の被験者をつかった評価実験 効果
本手法を使用しない場合と比較して, 正確さにおいて66.7ポイント向上した 問題背景
・手作業によるリファクタリングはエラーを起こす ・自動リファクタリングツールは使いにくい
提案手法
手動リファクタリングを監視し, エラー(条件違反)をリアルタイムに通知 GhostFactor
コードのスナップショット
Ac8ve Editor
警告 Refactoring Warning
条件違反 History Saving
Condi8on Checking
スナップショット のリスト Refactoring Detec8on 検出されたリファクタリング ・メソッドの抽出
対応している ・メソッドのシグネチャの変更
リファクタリング ・メソッドのインライン化
評価実験
被験者8名をツール使用・不使用グループに分け 6つのコードに対してリファクタリングしてもらう RQ1 : GhostFactorで正確にリファクタリングできるか ツール不使用グループ : 7/24 ツール使用グループ : 23/24
ツールを使用することで 正確さが66.7ポイント向上
RQ2 : GhostFactorで素早くリファクタリングできるようになるか 作業時間を計測し, 使用・不使用に有意差なし
マン・ホイットニーのU検定を適用
RQ3 : 手動リファクタリングを支援するために GhostFactorをどのように改善できるか 「利用者の意図するリファクタリングを予測し リファクタリングを終える前にエラーを提示する」
ICSEʼ’14勉強会 (2014年年7⽉月22⽇日)
担当者: ⽊木津 栄⼆二郎郎 ([email protected])
Alternate Refactoring Paths Reveal Usability Problems Mohsen Vakilian, Ralph E. Johnson
目的
自動リファクタリングツールにおける
ユーザビリティ問題の調査
貢献
臨界事象法を応用した分析手法
大量のデータ収集に基づく調査
効果
15のユーザビリティ問題を発見 そのうち13が未発見の問題 Y2
自動リファクタリングにおける臨界事象の収集
臨 ・ウィザードをいつ・どのように操作したか (naviga8on history) 界 ・リファクタリングを実行したかどうか (invoca8on method) 事 ・選択したコード片とその周辺のスライス (selec8on) 象 ・ツールが提示した,問題を表すメッセージ (messages) 開発者
記録
Coding Spectator
成功時の履歴(primary path)だけでなく, 取り消し・再実行も記録(alternate path) ⇒リファクタリング前の試行錯誤も記録 5分以上
時系列
直前の事象から5分以内に行われた事象をグルーピング
臨界事象データの分析
リファクタリング履歴 (36人3ヶ月2320時間)
1.メッセージごとに提示された回数を計測 ⇒Eclipseリファクタリングツールの提示メッセージは83種類
2.リファクタリングバッチを手作業で抽出 ⇒20分以内に行われた事象をリファクタリングバッチとみなす
3.145個のリファクタリングバッチを手作業で検査
⇒15種類のユーザビリティ問題を発見,そのうち13が未発見 ⇒Eclipse開発者はそれらを 本手法がユーザビリティ
問題として認識しており 問題を明らかにした 4種類は修正済み
ICSEʼ’14勉強会 (2014年年7⽉月22⽇日)
担当者: ⽊木津 栄⼆二郎郎 ([email protected])
Y3
A Study and Toolkit for Asynchronous Programming in C#
Semih Okur, David L. Hartveld, Danny Dig, Arie van Deursen
目的
C#非同期プログラミングにおける 古い記法(APM-­‐based)や 新しい記法(async/await)の誤用を正す
効果
本手法によるリファクタリングを行った 314パッチを開発者に認めてもらった 理由:研究の全体的な完成度の高さ 実態調査,手法とツール,評価実験と実績
実態調査
WindowsPhone7,8で動作するアプリの プロジェクトファイルをOSSから収集 総アプリ数 1378 総行数 12000 総開発者数 3376
RQ1:開発者はどのような方法で非同期プログラミングを利用するか •  古い記法(APM)が最も広く使われている Answer •  WP8の半数で新しい記法(async/await)が使われていた •  WP7で新しい記法は10プロジェクトでしか使われていなかった RQ2:開発者はasync/await記法をどのくらい誤用しているか Answer
誤用パターン
事例数 メソッド% アプリ%
Fire & Forget Methods
460
19%
76%
Unnecessary async/await Methods
324
14%
26%
Using Long-­‐running Opera8ons under Async Methods
115
5%
22%
Unnecessary Capturing Context
1770
74%
86%
自動リファクタリングを行うツールを2つ開発 1.  ASYNCIFIER「古い記法を新しい記法へ変換」 2.  CORRECTOR「新しい記法の誤用を正す(P2,3,4のみ)」
4つの観点でツールを評価
1. Applicability 2. Code Impact 3. Tool Performance
4. Usefulness of Patched Code 「事例全体でツール適用が成功した割合」
「1つの事例で平均何行書き換えたか」
「1つの事例で平均何ミリ秒掛かったか」 「それぞれのプロジェクトにパッチを提案し, どのくらいのパッチを開発者が認めたか」
ASYNCIFIER CORRECTOR
Applicability
54%
100%(P2,3,4のみ)
Code Impact
28.9行
2.1行
Tool Performance
508ミリ秒 47ミリ秒
Usefulness of Patched Code 28事例
286事例
ICSEʼ’14勉強会 (2014年年7⽉月22⽇日)
担当者: 丸⼭山 勝久 ([email protected])
Y4
Reuse-‐‑‒Oriented Reverse Engineering of
Functional Components form X86 Binaries
Dohyeong Kim, William N. Summer, Xiangyu Zhang, Dongyan Xu Hira Agrawal
⽬目的
バイナリコードにおける再利利⽤用の容易易化
l  レガシーシステムの⼀一部の機能を⼊入れ替えたい
バイナリコードにおける機能抽出の容易易化
l  悪意のあるコードにおいて特定の機能に対して
セキュリティ解析を適⽤用したい
Coverageに基づく⼿手法※1に⽐比べて機能の特定が狭い
効果 ※1 ある機能に関して実⾏行行された部分
∩ 他の機能に関して実⾏行行されなかった部分
アプローチ
X86バイナリコード
Dual Slicing
プログラムの実⾏行行履履歴
(特定のフィーチャーに関する)
関数の特定
call_mailer:
MOV ecx, [ebx]
…
Interface Casting
関数
値や参照先の固定化
call_mailer:
MOV ecx, 0x7ffee00
…
アドレス値
Dual Slicing
≒ 異異なる⼊入⼒力力に対して作成したdynamic slicesで異異なる
部分(値や条件)を抽出 ※正確な定義は論論⽂文を参照
dynamic slice = { .. , 18, 36, 37, 38, 42, 43 }
- 
Figure 4より引⽤用 –
17
18
19
command = read(stdin)
if (command == SEND) {
pine_send();
28 pine_send() {
31
editor(&env, &body);
35 editor(ENVELOPE* env, BODY* body) {
36
env->recipient = read(stdin);
37
env->subject = read(stdin);
38
env->text = read(stdin);
39 }
32
call_mailer(smtp_server, env, body);
41 call_mailer(…) {
42
s = connect(smtp_server);
43
send_to(s, …);
slice criterion
46 }
SPES 2011
実⾏行行1
の値
実⾏行行2
の値
SEND
SEND
R1
S1
B1
R2
S2
B2
1
1
Interface Casting
≒ 実⾏行行時の値に応じて,レジスタの値や参照先を固定化
- 
Figure 6より引⽤用 –
1 call_mailer(METAENV *header, …) {
3
smtp_mail(…, header->env, …);
Concretization
}
12 smtp_mail(…, EMVELOP *env, …) {
14
rfc822_output_header_line(…, env->subject);
642182: MOV eax, [ecx + 8]
if ecx + 8 == 0x7ffab40: MOV ecx, 0x7fff080
else:
MOV ecx, [ebx + 8]
}
21 rfc822_output_header_line(…, char *subject) {
…
23
while(n-- > 0 && (**d = *subject++) != ‘¥0’)
664fc9: MOV eax, [edx]
SPES 2011
}
if 0x7fff080 ≤ edx < 0x7fff080 + 10:
MOV eax, nSubject[edx-0x7fff080]
else: MOV eax, [edx]
Redirection