ネットワーク共生環境を築く情報技術の創出 テーマ4:高信頼性・高安全性を有するネットワーク共生環境の構築技術の創出

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
利用実績に基づくソフトウェア部品検索システムSPARS-J
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラム変更支援を目的とした コードクローン情報付加手法の提案と実装
ソースコードの利用関係を用いた 再利用性評価手法の提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
ソフトウェア部品の利用関係におけるスケールフリー性の調査
コードクローン検出技術と その利用法 神谷年洋‡, 植田泰士†, 肥後芳樹†, 楠本真二†, 井上克郎†
コードクローン分析ツールGeminiを用いたコードクローン分析手順
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
Javaソースコード蓄積・ 検索システムSPARS-Jの概要
類似度を用いたプログラムの再利用性尺度の提案と実現
オブジェクト指向プログラミング言語に対応した コードクローン検出技法の提案と実験
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向メトリクスを用いた 開発支援法に関する研究
ソフトウェアを取り巻く環境の変化がメトリクスに及ぼす影響について
Javaプログラムの変更を支援する 影響波及解析システム
クローン検出ツールを用いた ソースコード分析ツールの試作
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
利用実績に基づくソフトウェア部品検索システムSPARS-J
Javaを対象としたソフトウェア部品 検索システムSPARS-Jの実験的評価
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードクローン編集者数に着目した開発履歴の分析
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア部品グラフの次数分布におけるべき乗則の調査
第7回OACISシンポジウム 大阪大学におけるソフトウェア工学研究と産学連携活動
設計情報の再利用を目的とした UML図の自動推薦ツール
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
保守請負時を対象とした 労力見積のためのメトリクスの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
ソースコードの利用関係を用いた 再利用性評価手法の提案
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

ネットワーク共生環境を築く情報技術の創出 テーマ4:高信頼性・高安全性を有するネットワーク共生環境の構築技術の創出 ネットワーク共生環境を築く情報技術の創出 テーマ4:高信頼性・高安全性を有するネットワーク共生環境の構築技術の創出 大阪大学大学院情報科学研究科 大阪大学サイバーメディアセンター 21世紀COEプログラム(平成14年度採択分) 情報・電気・電子分野 (拠点番号: C12) 井上克郎 最終成果報告会 平成19年3月1日

高信頼性・高安全性を有するネットワーク共生環境の 構築技術の創出 メンバー構成 高信頼性・高安全性を有するネットワーク共生環境の 構築技術の創出 増澤利光 情報科学研究科コンピュータサイエンス専攻 教授 井上克郎 菊野 亨 情報科学研究科情報システム工学専攻 教授 藤原 融 情報科学研究科マルチメディア工学専攻 教授

テーマ[4]:高信頼性・高安全性を有するネットワーク共生環境の構築技術の創出 安全で安心なサイバー社会 応用・検証 情報家電 社会システムの復旧(支援) 自律性 (Autonomy) 情報の漏洩・不正使用の阻止 強靭性 (Resiliency) 携帯機器 セーフクリティカルシステム 強力な暗号・ 認証手続き オブジェクト指向設計・分析 ディペンダビリティ ソフトウェア工学 個人情報 セキュリティ 暗号・認証技術 セキュリティ工学 信頼性評価 自律的 再構成 ディペンダビリティ工学 分散アルゴリズム・通信プロトコル 分散システム工学

井上克郎、楠本真二、神谷年洋、“市村学術賞貢献賞”、(2003年4月). 代表的な論文、受賞 Inoue, K., Yokomori, R., Yamamoto, T., Matsushita, M., and Kusumoto, S., “Ranking Significance of Software Components Based on Use Relations,” IEEE Transactions on Software Engineering, Vol. 31, No. 3, pp. 213–225 (Mar. 2005). Takagi, Y., Mizuno, O., and Kikuno, T., “An Empirical Approach to Characterizing Risky Software Projects Based on Logistic Regression Analysis,” Empirical Software Engineering, Vol. 10, No. 4, pp. 495–515 (Oct. 2005). Izumi, T., and Masuzawa, T., “Condition Adaptation in Synchronous Consensus,” IEEE Transactions on Computers, Vol. 55, No. 7, pp. 843–853 (July 2006). Yasunaga, K., and Fujiwara, T., “Determination of the Local Weight Distribution of Binary Linear Block Codes,” IEEE Transactions on Information Theory, Vol. 52, No. 10, pp. 4444–4454 (Oct. 2006). 井上克郎、楠本真二、神谷年洋、“市村学術賞貢献賞”、(2003年4月). 水野修, 安部誠也, 菊野亨, “SECジャーナル創刊記念論文優秀賞”(2005 年11 月).

コードクローン (コード)クローン(Code Clone) ≒ 他に類似したコード片を持つコード片

大規模なソースコードからクローンを効率よく検出・分析するシステムが必要 クローンが引き起こす問題 コピー&ペーストを繰り返すと増加 クローンはソフトウェア保守を困難にする クローンにフォールトが存在する場合、すべてのクローンについて修正を行わなければならない 機能追加も同様 大規模なソースコードからクローンを効率よく検出・分析するシステムが必要  → 塩基配列の分析法を応用

塩基配列の分析 塩基配列 マイコプラズマ

同形部分列の高速検出アルゴリズム 塩基配列の同形部分列 分布図

大阪大学大学院情報科学研究科松田研究室提供 マイコプラズマの中の同形部分列 大阪大学大学院情報科学研究科松田研究室提供

Suffix-treeによるマッチングアルゴリズム 以下の条件を満たす木 (1)木の葉は部分文字列の開始位置 (2)根から葉までラベルをたどると部分文字列になる (3)ひとつの節点から出る辺のラベルはすべて異なる文字で始まる →共通のパス=クローン

1. static void foo() throws RESyntaxException { 例題コード 1. static void foo() throws RESyntaxException { 2. String a[] = new String [] { "123,400", "abc", "orange 100" }; 3. org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+"); 4. int sum = 0; 5. for (int i = 0; i < a.length; ++i) 6. if (pat.match(a[i])) 7. sum += Sample.parseNumber(pat.getParen(0)); 8. System.out.println("sum = " + sum); 9. } 10. static void goo(String [] a) throws RESyntaxException { 11. RE exp = new RE("[0-9,]+"); 12. int sum = 0; 13. for (int i = 0; i < a.length; ++i) 14. if (exp.match(a[i])) 15. sum += parseNumber(exp.getParen(0)); 16. System.out.println("sum = " + sum); 17. }

ステップ(1):ソースコードを入力しトークンの列にする

ステップ(2):変形ルールによりトークン列を変形する

ステップ(3):パラメータ置換を行う

ステップ(4):サフィックス木アルゴリズムによりクローンを検出

検出結果(右下方向への直線としてクローンが出現) 対角線を中心とした線対称 短いクローンは多数 対角線は常に* 長いコードクローン

ステップ(5):元のソースコード上にマップ 1. static void foo() throws RESyntaxException { 2. String a[] = new String [] { "123,400", "abc", "orange 100" }; 3. org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+"); 4. int sum = 0; 5. for (int i = 0; i < a.length; ++i) 6. if (pat.match(a[i])) 7. sum += Sample.parseNumber(pat.getParen(0)); 8. System.out.println("sum = " + sum); 9. } 10. static void goo(String [] a) throws RESyntaxException { 11. RE exp = new RE("[0-9,]+"); 12. int sum = 0; 13. for (int i = 0; i < a.length; ++i) 14. if (exp.match(a[i])) 15. sum += parseNumber(exp.getParen(0)); 16. System.out.println("sum = " + sum); 17. }

CCFinder/ICCAを150以上の組織に配布 クローン分析の適用 CCFinder/ICCAを150以上の組織に配布 開発したソフトウェアの品質チェック 開発の問題発見 下請け,受け入れチェック コードの改良(リファクタリングツールAries) 著作権侵害の検査 民事裁判(ソースコードの盗用訴訟)の証拠 システムの類似度,進化 Kamiya, T., Kusumoto, S., Inoue, K., “CCFinder: A Multilinguistic Token-Based Code Clone Detection System for Large Scale Source Code”, IEEE Trans. on Software Engineering, Vol. 28, No. 7, 654-670 (July 2002).

FreeBSD, Linux, NetBSDのクローン散布図 Linuxと他の2つのOSの間にはクローンが少ない   → Linuxは独自      開発による FreeBSDとNetBSDの間には多数のクローン   → 共通の祖先

学生Bと学生Eの間に多くのコードクローン 学生の演習結果の分析 学生Bと学生Eの間に多くのコードクローン A B C D E B A B C D E E

ソフトウェアの進化の分析に応用 BSD Unixの歴史

クローン含有比率を類似度と考え、クラスタ分析

CCFinderの適用限界を超えた分析 80台の学生演習用PC-WS上で 問題を小さなタスクに分割 分割された各タスクを分散実行 超大規模分析の試み CCFinderの適用限界を超えた分析 80台の学生演習用PC-WS上で 分割された各タスクを分散実行 問題を小さなタスクに分割

対象:UNIX Portsの全ソースプログラム 超大規模コードクローン分析(!) 対象:UNIX Portsの全ソースプログラム (10.8GB, 4億行のCプログラム) Livieri, S., Higo, Y., Matsushita, M., Inoue, K., “Very-Large Scale Code Clone Analysis and Visualization of Open Source Programs Using Distributed CCFinder: D-CCFinder“, International Conference on Software Engineering, Minneapolis, MN. (May 2007, to appear)

超大規模コードクローン分析(2) 対象:Linuxのカーネル136バージョン (7.4GB, 2.6億行のCプログラム)

大規模なコードクローン分析 ソフトウェアの流用、再利用の関係を大局的に把握 ソフトウェアの利用関係をより系統的に分析 ソフトウェアの利用関係グラフの調査 大規模なコードクローン分析    ソフトウェアの流用、再利用の関係を大局的に把握 ソフトウェアの利用関係をより系統的に分析

A B ソフトウェア部品 (部品) ソフトウェア部品グラフ (部品グラフ) ソフトウェア部品グラフ ソフトウェアの構成単位 クラス,関数,… 互いに利用関係が存在 変数宣言,呼び出し,… ソフトウェア部品グラフ (部品グラフ) ソフトウェア部品を頂点・利用関係を 有向辺としたグラフ ソフトウェアの静的な構造を反映 class A { public void exec () { … } class B { … A.exec(); } A B 背景としてソフトウェア部品グラフについて。 まずソフトウェア部品とは,クラスや関数といったソフトウェアの構成単位のことを指す. 部品間には,変数宣言や,呼び出しなどの利用関係が存在する 例えばJavaのクラスを部品とすると,これらのクラスA,Bはそれぞれ部品になる.  クラスAにはexec()というメソッドがあり,Bには,そのメソッドに対する呼び出しが存在する.  このとき,BからAへの利用関係が存在する. ソフトウェア部品グラフは,ソフトウェア部品を頂点,利用関係を有効辺としたグラフのことを言う. 先ほどの部品と利用関係は,このような2頂点からなるグラフとして表される. 実際にはソフトウェア全体などでグラフを構成する. ソフトウェアの静的な構造を反映していて, ソフトウェア工学の様々な手法に用いられる. 本研究では,ソフトウェアをソフトウェア部品グラフとして表し, その特徴から,ソフトウェアの性質を得ることを目標とする. ソフトウェア部品の利用特性? ソフトウェア部品グラフ ソフトウェア群

ソフトウェア部品グラフの例 あるC++のライブラリの部品グラフ

ソフトウェア部品グラフの調査 酵母内のタンパク質相互関連 各タンパク質の関連次数の分布 ? C++の部品の利用関係

対象:Javaソフトウェアに基づく部品グラフ 準備: 部品グラフと部品集合 対象:Javaソフトウェアに基づく部品グラフ 部品(頂点):Javaのクラス 利用関係(辺): Javaクラス間の静的な利用関係 継承,実装,変数宣言,生成,フィールド参照,メソッド呼び出し 概要 クラス数 JDK Java 基本ライブラリ JDK1.4 約11,000 ECLIPSE Java統合開発環境 Eclipse 3.0.1 約14,000 NETBEANS Java統合開発環境 NetBeans 3.6 約13,000 APACHE Apache Projectから収集したソフトウェア集合 約59,000 ALL 上記の全て 約180,000 部品集合 詳細な利用関係に基づく部品グラフ・複数のソフトウェア集合に基づく部品グラフの次数分布は,べき乗則に従うか? 入力次数・出力次数を調査

ALLの入力次数上位の部品 メトリクスとの相関 JDKなど,基礎的な役割をもつ部品 String,Objectは特に大きな値 調査1:入力次数 ALLの入力次数上位の部品 JDKなど,基礎的な役割をもつ部品 String,Objectは特に大きな値 クラス名 行数 出力次数 入力次数 1 java.lang.String 675 21 116,326 2 java.lang.Object 35 4 98,377 3 java.lang.Class 605 41 29,767 java.lang.Exception 15 21,057 5 java.lang.Throwable 136 12 19,536 メトリクスとの相関 行数、複雑度とは相関なし メソド数とやや相関 出力次数 行数 複雑度 メソッド数 入力次数 0.00 0.07 0.08 0.24

JDK ALL べき乗則に従う 調査1: 入力次数の分布 a R*2 JDK ALL 2.1 ±8.6×10-3 0.99 ・グラフ,表の見方 ・きれいに直線上にならんでいる ・寄与率も高い →べき乗則に従う. ・べきの乗数であるaの値は,他の分野で観測されることの多い 2 に近い値.  例えばWWW上のページのリンク数もこの辺. ・最大値はJDKは約6400だが,対してALLは約11万 →部品数の違いを考慮しても,大きな差が出ている a R*2 JDK 2.1 ±8.6×10-3 0.99 ALL 2.0 ±1.4×10-3 1.00 べき乗則に従う

ALLの出力次数上位の部品 メトリクスとの相関 調査2: 出力次数 単純に大きな部品 行数や複雑度・メソッド数と高い相関 クラス名 行数 入力次数 1 org.apache.poi… …FunctionEval 364 354 2 org.jgraph.GPGraphpad 2,196 255 130 3 com.jgraph.GPGraphpad 2,200 253 131 4 542 252 209 5 org.eclipse.jdt… …ASTConverter 4,520 223 ALLの出力次数上位の部品 単純に大きな部品 メトリクスとの相関 行数や複雑度・メソッド数と高い相関 入力次数 行数 複雑度 メソッド数 出力次数 0.00 0.83 0.75 0.64 ・出力次数に関して,部品との関連をみていくことで,  べき乗則に従わなかった要因を調べる. ・表(上)の説明 ・単純に規模の大きな部品が並んでいる ・表(下)の説明  ・出力次数と,入力次数,行数,複雑度,メソッド数と相関を取った結果  ・... →出力次数は,他の部品の存在にあまり影響されず,  部品の規模や複雑さと関係するため  ・部品に記述された内容に基づいている  ・極端に大きな部品=規模が大きく複雑な部品は非現実的で,あまり存在せず,   存在してもたかだか200~300程度ということ.

JDK ALL べき乗則には従わない 値の小さな部分は曲線 調査2: 出力次数の分布 a R*2 JDK ALL 3.1 ±8.2×10-2 ・図,表の見方. ・値の大きな範囲では入力と同様に直線だが,  値の小さな範囲で曲線になっている →べき分布では無い <s>・参考程度に直線に回帰してみると,かなり大きな傾き.  極端な値が出にくい.</s> ・最大値はJDKが140でALLは350で,あまり大きな違いは無い a R*2 JDK 3.1 ±8.2×10-2 0.88 ALL 3.7 ±6.9×10-2 0.90 べき乗則には従わない 値の小さな部分は曲線

この結果を利用して、有用な部品を効率よく検索できる方法は? 調査のまとめ 入力次数 べき乗則に従う 高い度合い 部品の役割に関連し,基礎的な役割の部品が大きな次数をもつ 多くにとって有用な部品は多数の部品から利用される 出力次数 べき乗則には従わない 値の小さな部分が異なる 部品の規模や複雑さと関連し,極端に大きな部品はあまり存在しない 大きくなりすぎると使いづらい ・入力次数  ・高い度合いでべき乗則に従い,部品集合により値域に大きな差  ・これは,部品の役割に関連し,基礎的な部品は大きな次数をもつため. ・出力次数  ・べき乗則に従わず,部品集合がかわっても値域はあまり変わらない  ・これは,出力次数が部品そのものの規模や複雑さに関係し,極端に大きな部品は存在しないため, この結果を利用して、有用な部品を効率よく検索できる方法は?

重要な部品 ≒ 入力次数の大きいもの 問題点 コンポーネントランクCR法 入力次数が低いものが多数あり、分解能悪い 部品グラフの特性を利用した部品検索法 重要な部品  ≒  入力次数の大きいもの 問題点 入力次数が低いものが多数あり、分解能悪い 入力次数が高いものの近傍の部品は、重要にしたい コンポーネントランクCR法 他分野のランク付け参考 Influence Weight (学術論文誌の重要度評価) PageRank (GoogleにおけるWebページの評価) 重要な部品 多数の部品から参照されている 重要な部品から参照されている 部品グラフの隣接行列の固有ベクトルの要素 = 重要度

SPARS-J Software Product Archive, analysis Retrieval System for Java Javaソフトウェア部品検索システム 大量のJavaのソースコードから部品を切り出す 部品を解析し,自動的に情報を抽出 検索要求と検索結果 SPARS-Jのアーキテクチャ

SPARS-Jの実行画面

SPARS-Jを用いることでソフトウェア検索の能力が飛躍的に向上し、ソフトウェア開発や保守が効率化 実用的なソフトウェア検索システムとして世界に先駆けて公開 http://www.spars.info/demo. “Ranking Significance of Software Components Based on Use Relations,” IEEE Transactions on Software Engineering, Vol. 31, No. 3, pp. 213–225 (Mar. 2005) Google Code Searchより先行し、優れたコード分析能力 ソフトウェアの再利用に有効 再利用によりソフトウェアの生産性は47%向上 Boehm, B., “Managing Software Productivity and Reuse”, IEEE Computer, Vol.32, No. 9, pp.111-113 (Sep. 1999). 今までソフトウェア再利用のための自動リポジトリ構築システムはなかった SPARS-Jが世界に先駆けて実用化 サントリー㈱の社内ソフトウェア資産管理にSPARS-Jを適用し、有効性の確認 SPARS-Jを用いることでソフトウェア検索の能力が飛躍的に向上し、ソフトウェア開発や保守が効率化

塩基配列の分析技術を応用したソフトウェア分析技術 コードクローン分析 生物に学ぶソフトウェア工学技術 塩基配列の分析技術を応用したソフトウェア分析技術 コードクローン分析 ネットワークの性質:Power Law 生物界ネットワーク 計算機ネットワーク ソフトウェア利用関係ネットワーク ソフトウェアの再利用支援技術 検索性能の向上 → ソフトウェア開発や保守の効率向上