More Related Content Similar to ICST2015勉強会 Static Analysis トラック論文紹介 Similar to ICST2015勉強会 Static Analysis トラック論文紹介 (6) More from Hironori Washizaki More from Hironori Washizaki (20) ICST2015勉強会 Static Analysis トラック論文紹介2. “A Lightweight, Static Approach to Detecting
Unbounded Thread-Instantiation Loops”
Jing Xu 他 (University of Texas at Arlington)
• 目的: 上限なくスレッドを生成してしまう可能性の
あるループを簡易に発見
• アイディア:
– スレッド生成の決定ロジックはたいていシンプル
– 経験則によりパターンを幾つか定義
• 貢献
– 軽量なスレッド生成非有界ループの静的解析手法
– 手法のEclipseプラグイン実装
– 24のJavaサーバアプリケーションにおいて有用性を確
認
2
3. 動機づけの例
• Tornado: マルチス
レッドWebサーバ
• minIdleThreadsは
定数
• しかしidleThreads
は単調増加「しな
い」可能性あり
3
1 public void run() {
2 int minIdleThreads = Tornado.getConfig().getMinIdle();
3 int maxIdleThreads = Tornado.getConfig().getMaxIdle();
4 while (true) {
5 try {
6 Thread.sleep(this.sleepTime);
7 } catch (InterruptedException e) {}
8 int idleThreads = this.threadPool.getIdleThreads();
9 Tornado.log.debug(idleThreads + " idle; "
+ this.threadPool.getBusyThreads() + " busy");
10 if (idleThreads < minIdleThreads) {
11 spawnThreads(minIdleThreads - idleThreads);
12 continue;
13 }
14 if (idleThreads <= maxIdleThreads)
15 continue;
16 killThreads(idleThreads - maxIdleThreads);
17 }
18 }
19 private void spawnThreads(int num) {
20 Tornado.log.debug(num + "new threads spawned");
21 for (int i = 0; i < num; i++)
22 this.threadPool.addThread();
23 }
24 public void addThread() {
25 ServerThread t = new ServerThread(this.serverGroup,
this.taskPool, this);
26 t.start();
27 }
Jing Xu, et al, “A Lightweight, Static Approach to Detecting Unbounded Thread-Instantiation Loops,” ICST2015.
4. 手法など
• 具体的には
– 5つのスレッド生成有界パターンを経験則で定義
– パス解析によりパターンに適合しなければNG判定
– 呼び出しやループのネスト数の制限により解析時間
を調整可能(従って見逃しもある)
• 評価
– 24のJava OSSマルチスレッドサーバ
– 41のNG判定、うち38は正しかった
– 実行時間は数分~15時間以上
• 所感
– 実用を十分に検討(ただし見逃しは?)
– やっぱりパターン!
4
Jing Xu, et al, “A Lightweight, Static Approach to Detecting Unbounded Thread-Instantiation Loops,” ICST2015.
5. “QuickChecking Static Analysis Properties”
Jan Midtgaard 他 (Aarhus University)
• 目的: 動的言語における静的解析ツールの性質テスト
• アイディア:
– 静的解析の正しさは、仕様が束(ラティス)を形成することと、
その束上で関数が単調写像であること
– 関数型言語向けのQuickchecking手法の応用: 入力の生成と
性質のテスト
• 貢献:
– 動的言語における型解析の束構造のテスト
– テストしたい性質を定義する型安全なOcamlベースDSL
– 型安全な汎用のコンビネータを複数用意
– Lua言語用の型解析系において欠陥を発見、単順なカバレッ
ジテストでは発見困難
• 所感: 「静的解析ツールは正しいのか?」というメタな問
いへのチャレンジ。他にも同様の問いかけはありそう。
5
6. 6
module L = struct
let name = "examplelattice"
type elem = Top | Bot
let leq a b = match a,b with
| Bot, _ -> true
| _, Top -> true
| _, _ -> false
let join e e’ = if e = Bot then e’ else Top
let meet e e’ = if e = Bot then Bot else e’
(* ... *)
let to_string e = if e = Bot then "Bot" else "Top"
end
let flip e = if e = L.Bot then L.Top else L.Bot
Jan Midtgaard, et al. “QuickChecking Static Analysis Properties,” ICST 2015.
単調写像ではない関数
TopとBotからなる束
7. “Sound and Quasi-Complete Detection of
Infeasible Test Requirements”
Sebastien Bardin 他 (CEA)
• 目的: 実行不可能なテスト要求を概ね全て静的解析
により自動検出
• アイディア:
– 値解析と最弱事前条件計算の利用
– カバレッジ上のテスト要求 ⇒ ラベル ⇒ アサーション
• 貢献:
– 実行不可能なテスト要求の自動検出
– 12の小規模プログラムに対して、条件網羅、複数(複合)
条件網羅における実行不可能なテスト要求をほぼ全て検
出成功
– テスト自動生成の効率化に寄与: 平均3.8倍
• 所感:
– 自動テスト用途では有用そう
– 現実の一定規模プログラムにスケールするか? 7
8. 8
statement_1;
if (x==y && a<b)
{...};
statement_3;
statement_1;
//! l1: x==y
//! l2: x!=y
//! l3: a<b
//! l4: a>=b
if (x==y && a<b)
{...};
statement_3;
statement_1;
//! l1: x==y && a<b
//! l2: x!=y && a<b
//! l3: x==y && a>=b
//! l4: x!=y && a>=b
if (x==y && a<b)
{...};
statement_3;
条件網羅 複数(複合)条件網羅
if (x) {
//! l1: !x && !y
if (!x || y)
{...};
}
if (x) {
//@ assert !(!x && !y);
if (!x || y)
{...};
}
非実行可能なテスト要求から妥当な表明への変換
Sebastien Bardin, “Sound and Quasi-Complete Detection of Infeasible Test Requirements,” ICST2015.