Department of Computer Science Graduate School of Information

  • Slides: 24
Download presentation
エイリアス解析を用いた メソッドの入力データの 利用法可視化ツール 大阪大学 鹿島 悠,石尾隆,井上克郎 Department of Computer Science, Graduate School of Information

エイリアス解析を用いた メソッドの入力データの 利用法可視化ツール 大阪大学 鹿島 悠,石尾隆,井上克郎 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 1

例: 引数のフィールドへのアクセスの把握 引数のformを検証するメソッド protected boolean validate. Form(final Http. Servlet. Request request, final User. Form

例: 引数のフィールドへのアクセスの把握 引数のformを検証するメソッド protected boolean validate. Form(final Http. Servlet. Request request, final User. Form form) throws Service. Exception { 引数で渡されたformの フィールドのうち アクセスされたのは3つだけ if (form. get. Id() == 0) { User user = Service. Facotry. get. Service(IUser. Service. class). find. By. User. ID(form. get. User. Id(), User. Kubun. value. Of(form. get. User. Kubun())); アクセスされるフィールドを 正確に把握するには, if (user != null) { メソッドの詳細な探索が必要 add. Error(request, "errors. ucm 02. exist. user"); return false; } id user. Id } アクセス された user. Kubun name password … } return true; form アクセス されて いない ※IT-Spiral[2]教材の和歌山大学教務システム ソースコードより抜粋 [2]: http: //it-spiral. ist. osaka-u. ac. jp/ Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 4

例:クラス変数への明示的でないアクセス このメソッド内で直接は,データベースの セッション管理変数にアクセスしていない protected boolean validate. Form(final Http. Servlet. Request request, final User. Form

例:クラス変数への明示的でないアクセス このメソッド内で直接は,データベースの セッション管理変数にアクセスしていない protected boolean validate. Form(final Http. Servlet. Request request, final User. Form form) throws Service. Exception { if (form. get. Id() == 0) { User user = Service. Facotry. get. Service(IUser. Service. class). find. By. User. ID(form. get. User. Id(), User. Kubun. value. Of(form. get. User. Kubun())); メソッドの呼び出し先でアクセス find. By. User. Id() call アクセスされるクラス変数をUserservice. Imple. get. DAO() call 正確に把握したい場合も, Hibernate. DAOFactory. get. DAOFactory() if (user !=メソッドの詳細な探索が必要 null) { add. Error(request, "errors. ucm 02. exist. user"); return false; } } return true; } call Hibernate. Util. current. Session() read クラス変数: Hibernate. Util. SESSION データベースのセッション管理変数 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5

既存研究(1/2) n プログラムスライシング n 変数間の制御依存関係とデータ依存関係を列挙 引数 form に対する前向きプログラムスライスのうち, データ依存関係の一部 protected boolean validate. Form(final Http.

既存研究(1/2) n プログラムスライシング n 変数間の制御依存関係とデータ依存関係を列挙 引数 form に対する前向きプログラムスライスのうち, データ依存関係の一部 protected boolean validate. Form(final Http. Servlet. Request request, final User. Form form) throws Service. Exception { if (form. get. Id() == 0) { User user = Service. Facotry. get. Service(IUser. Service. class). find. By. User. ID(form. get. User. Id(), User. Kubun. value. Of(form. get. User. Kubun())); if (user != null) { add. Error(request, "errors. ucm 02. exist. user"); return false; } } return true; } Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 6

既存研究(2/2) n データフローグラフによるコードナビゲーションツール[3] n メソッドの呼び出し関係と変数間のデータフローをグラフ表示 this validate. Form request form 呼び出し関係 return データフロー this

既存研究(2/2) n データフローグラフによるコードナビゲーションツール[3] n メソッドの呼び出し関係と変数間のデータフローをグラフ表示 this validate. Form request form 呼び出し関係 return データフロー this get. Id() get. Field(Id) return this get. User. Kubun() return get. User. Id() return get. Field(user. Id) get. Field(user. Kubun) [3]: A Lightweight Visualization of Interprocedural Data-Flow Paths for Source Code Reading Takashi Ishio, Shogo Etsuda, and Katsuro Inoue, ICPC 2012, pp. 37 -46, 11 -13 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 7

ステップ 1: 別名解析 n 代入や関数呼び出しにより,ポインタがコピーさ れた変数をグループ化 p Yanら[4]のエイリアス解析を使用 緑文字はクラス変数 validate. Form (form) { …

ステップ 1: 別名解析 n 代入や関数呼び出しにより,ポインタがコピーさ れた変数をグループ化 p Yanら[4]のエイリアス解析を使用 緑文字はクラス変数 validate. Form (form) { … if (form. get. Id()) { … form. get. User. Id() … } int get. Id() { return this. Id; form. Id; } String get. User. Id() { this. user. Id; return form. user. Id; } static Session current. Session() { static Session current. Session() Session s= SESSION. get(); { { static Session current. Session() s ={ SESSION. get(); if. Session (s == null) Session s ={ SESSION. get(); if s(s=== null) SESSION_FACTORY if s(s=== null) { SESSION_FACTORY. open. Session(); s =. open. Session(); SESSION_FACTORY SESSION. set(s); . open. Session(); } SESSION. set(s); return s; } } [4]: Dacong Yan, Guoqing Xu, and Atanas Rountev. Demand-driven context-sensitive alias analysis for Java. ISSTA '11. , 155 -165. New York, NY, USA , 2011. Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 11

ステップ 2: アクセスの列挙 n 以下へのアクセスを検索し,アクセスの対象・出現するメソッド・読み 書きの種類(RW),という三つ組を列挙 p p クラス変数へのアクセス クラス変数・引数・注目するメソッドのオブジェクトが持つフィールドへの アクセス validate. Form (form)

ステップ 2: アクセスの列挙 n 以下へのアクセスを検索し,アクセスの対象・出現するメソッド・読み 書きの種類(RW),という三つ組を列挙 p p クラス変数へのアクセス クラス変数・引数・注目するメソッドのオブジェクトが持つフィールドへの アクセス validate. Form (form) { String get. User. Id() { … return form. user. Id; if (form. get. Id()) { } … form. get. User. Id() … } static Session current. Session() { … Session s = SESSION. get(); if (s == null) { } int get. Id() { return form. Id; } s = SESSION_FACTORY. open. Session(); SESSION. set(s); } return s; 対象 メソッド 読み 書き form. Id get. Id R form. User. Id get. User. Id R SESSION current. Session R SESSION_ FACTORY current. Session R } Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12

ステップ 2 : 補足 void main(A a) { A a 2 = new(); A

ステップ 2 : 補足 void main(A a) { A a 2 = new(); A a 3 = a; a 2. f = “foo”; print(a 3. g); a 3. h = “bar”; } 対象 メソッド 読み 書き a. g main R a. h main W a 2. f main W メソッド呼び出し後に作成されたオブジェクトと そのフィールドに対するアクセスは出力には含まない Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 13

ステップ 3:ツリー構造での可視化 n ステップ 2の出力を変数とフィールドの階層構造に合わ せツリー状に表示 p 変数・フィールドごと,メソッドごとにRWをまとめて表示 boolean validate. Form(request, form) 対象 メソッド

ステップ 3:ツリー構造での可視化 n ステップ 2の出力を変数とフィールドの階層構造に合わ せツリー状に表示 p 変数・フィールドごと,メソッドごとにRWをまとめて表示 boolean validate. Form(request, form) 対象 メソッド 読み 書き form get. Id(): R form. Id get. Id R Id : R form. User. Id get. User. Id R User. Id : R SESSION current. Session R SESSION_ FACTORY current. Session R SESSION : R get. User. Id(): R current. Session() : R SESSION_FACTORY : R current. Session() : R Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 14

validate. Formに対する表示 引数form中の使用されるフィールドを表示 データベースアクセスに関わる 大域変数を表示 Department of Computer Science, Graduate School of Information Science

validate. Formに対する表示 引数form中の使用されるフィールドを表示 データベースアクセスに関わる 大域変数を表示 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 16

被験者と割り当て n 被験者 p 学生8名 n アプリケーションの順番とツールの有無で,4グ ループに分割 1回目 グループ 1 グループ 2 グループ

被験者と割り当て n 被験者 p 学生8名 n アプリケーションの順番とツールの有無で,4グ ループに分割 1回目 グループ 1 グループ 2 グループ 3 グループ 4 Argo. UML (ツール有り) Argo. UML Gantt. Project (ツール有り) Argo. UML (ツール有り) 2回目 Gantt. Project Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 19

実験結果(1/2) n 解答時間の分布 長 : 解 答 時 間 : 短 ツール有り ツール無し Argo.

実験結果(1/2) n 解答時間の分布 長 : 解 答 時 間 : 短 ツール有り ツール無し Argo. UML Gantt. Project ツール有りの被験者の方が作業を早く終える傾向にあった n 正答率 Argo. UML Gantt. Project ツール有り 0. 5 (2/4) 0. 25 (1/4) ツール無し 0. 25 (1/4) Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 20