SHINSHU UNIVERSITY
組み込みソフトウェアにおける
インパクト分析支援ツールの実現と評価
海海研 M2
07TA519H 川平 航介
2009-02-07
目次
背景
目的
組み込みソフトウェア
手法について
ツールの概要
評価実験
まとめ,今後の予定
2
背景(1/3)
組込みソフトウェアは大規模・複雑化している
既存ソフトウェアの再利用が不可欠
再利用のため,変更箇所を予測することが重要
仕様書の変更箇所からソースコードの該当箇所を調
べる必要がある
3
背景(2/3)
★問題点
組込みソフトウェアでは,機能ごとにモジュール化
されずに散在している場合もある
実際の開発では仕様書とソースコードの関連の
記述が不十分な場合も多い
どこを変更すれば良いのか分かりにくい
4
背景(3/3)
★解決策
仕様書とソースコードのトレーサビリティが必要
しかし…
新たな開発手法の導入は開発者への負担が大
きい
今ある資源を使って開発をサポートすることが重要
5
目的
組み込みソフトウェアへの変更要求に対して,ソ
ースコード上の変更箇所を絞り込むことをサポー
トする
既存のソースコード,仕様書などの資源を活用し
て,効率よく変更箇所を絞り込むためのツールを
開発し,評価を行う
6
組込みソフトウェアとは
機器に組み込まれてその制御を行うもの
組み込みソフトウェアが使われる場所
情報機器…カーナビ,携帯電話,テレビ
家電…電子レンジ,炊飯器
PC関連…プリンタ,ネットワーク機器
他…自動車,ゲーム機,エレベータ
etc...
ほとんどの電子機器に使われている
7
組込みソフトウェアとは
品質に対する要求が高い
機能を実装するだけでは駄目
ハードウェアとの同時開発
開発開始時には動作する環境が存在しない
技術レベルの変化に敏感
すぐに新しい技術が投入される
動作条件が多様
OSの有無,極端にメモリの少ない環境等
8
手法について
入力(あるもの)
要求
「○○を変更・追加したい」
旧バージョンのソースコード
新,旧バージョンの仕様書(今回はハードウェアのもの)
既存ソフトウェアに関する知識
出力(欲しいもの)
変更が予測される箇所(関数)の一覧
これらの入力から出力を得るのが目標
9
手法について
仕様とソースコードを結びつける方法
IR手法・・・情報検索
アスペクト指向・・・ソースコードに埋め込む
動作シナリオを用いる・・・シナリオを書いて動作をみる
デザインパターンを用いる・・・設計から管理
10
手法について
条件
現在の開発手法を維持
既存のリソースを使う
(半)自動的にやりたい
⇒IR手法が有望
単純なキーワード検索を組み合わせ,変更予測
をする
11
最近->関数の特徴
キーワード以外に使えるものは無いのか?
実際に変更があった関数の特徴について
LoC
呼び出される回数
含まれる単語
あまり期待できないが,一応調査した
12
最近->LoC
関数のLoC
変更された関数と全体の分布を比べる
全体
変更された関数
1000
100
10
1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
13
最近->呼び出される回数
呼び出される回数
全体
変更
100
10
1
2
1
4
3
6
5
8
7
10 12 14 16 18 20 22 24 26 28 30
9 11 13 15 17 19 21 23 25 27 29
14
最近->含まれる単語
単語
全関数(300)中の単語らしき文字列
1445
変更された関数(13)にのみ現れる単語 160
この160語に含まれる単語を使えば精度の高い検
索ができる
特徴的な単語は少ない
これらの単語を前もって選ぶのは非現実的
特徴的な語が全く含まれない関数もある
15
ツールの概要
目的
変更要求から,ソースコード上の変更すべき箇所を
見つける
機能
仕様書上で変更要求に関連するキーワードを検索
キーワードからソースコード中の関数を検索
2回の検索の前後に人間の補正を入れることで,
まともな検索結果を得られるように
16
ツールの概要
変更要求
--------------------------------------------
仕様書
検索条件
検索
#include < stdio.h>
int main(){
int n,sum,min,max,i,p;
F ILE * fp = fopen(" A" ," r" );
while(fscanf(fp," % d" ,&n),n) {
min = 9999, max = 0, sum = 0;
for(i= 0;i< n;i+ + ) {
fscanf(fp," % d" ,&p);
if (p> max) max= p;
if (p< min) min= p;
sum+ = p;
}
printf(" % d\n" ,(sum-max-min)/(n-2));
}
return 0;
}
ソースコード
キーワード
検索
検索条件
変更する関数の候補
17
ツールの概要
検索に使う単語の抽出
仕様書から,変更要求によって追加・変更された機
能に関連が深い単語を検索する
ソースコード上に現れそうな単語をキーワードとする
単語の形をソースコード中で使われているものに合わ
せる(いまのところ手作業)
例:status,control ⇒ stat,ctrl
18
ツールの概要
ソースコードからキーワードを検索
関数ごとにキーワードの出現回数をカウントする
識別子は単語ごとに分解
FUNC_TYPE,getName ⇒ func, type, get, name
閾値と検索条件の調整
検索結果に現れる関数を見て,検索条件を調節し,
検索を繰り返す
19
ツールの概要
構成
GUIはJava
(長田さん)
内部の検索処理はいくつかのPerlスクリプトで実現
ソースコードの関数ごとの検索
仕様書の章ごとの検索
再現率や精度等の計算
20
評価実験->分析対象
分析対象
組込みシステムのうちの,ハードウェアを制御するドラ
イバ
ソースコードはC言語で書かれている
結果を評価するために,実製品の2つのバージョンの
開発データを使用した
実製品のデータなので,数値などは精度を低くし
て示してある
21
評価実験->評価方法
評価方法
結果を評価するため,2つのバージョンの差異をあ
らかじめ抜き出しておく
2つのバージョン間の差違
変更あり
ファイル数
関数
行数(LOC)
10
20
1000
全体
20
300
30~40k
22
評価実験->評価方法
用語の説明1
recall
(再現率)
正しく見つけられた数/見つけるべき物の数
見つけられなかったものが多いと値が小さくなる
precision (精度)
正しく見つけられた数/見つかった数
見つけたものに不要なものが多く入っているほど小さい
23
評価実験->評価方法
用語の説明2
candidate
ソースコード全体のうち,どれだけが候補に含まれるか
小さいほど確認する範囲が少なくて済む
閾値
一定の個数以上キーワードを含む関数を列挙するため
の閾値
24
評価実験->評価方法
閾値ごとに,キーワード数と再現率と精度の関係
を調べた
全ての変更箇所を見つけることが目的であるため,
再現率が1になる条件に注目する
25
評価実験->結果
キーワードの検索については省略
適当な単語を使って仕様書からキーワードを検索
50個程度のキーワードが候補に挙がった
そのうち使えそうな8個のキーワードを選んだ
26
評価実験->結果
キーワードが1回以上現れる関数
Threshold:1
recall
precision
candidate
検索の閾値:
これ以上キーワードを含む
関数を見つける(複数回現
れてもカウント)
1.2
1
0.8
0.6
0.4
0.2
検索に使うキーワードの数
0
1
2
再現率(recall)と
精度(precision)の値
3
4
5
6
7
8
keywords
27
評価実験->結果
キーワードが1回以上現れる関数
キーワード数を4個にした時点で再現率が1に
必要な関数が全て見つかった
再現率が1になった時点での精度は約0.15
低い・・・85%は変更の必要が無い関数
28
評価実験->結果
キーワードが5回以上現れる関数
Threshold:5
recall
precision
candidate
1.2
1
0.8
0.6
0.4
0.2
0
1
2
3
4
5
6
7
8
keywords
29
評価実験->結果
キーワード数を5にした時点で再現率が1になる
再現率が1になった時の精度は0.28
閾値を上げたことで多少良くなった
このときのCandidate が0.2…
確認する範囲は全体の2割でよい
30
評価実験->結果
キーワードが6回以上現れる関数
Threshold:6
recall
precision
candidate
1
0.8
0.6
0.4
0.2
0
1
2
3
4
5
6
7
8
keywords
31
評価実験->結果
出現回数を6回にした場合,キーワード数を増や
してもrecallが1にはならなかった
6以上の閾値では検索から漏れる関数が出てくる
6未満に設定しなければならない
32
評価実験->考察
今回の分析対象の場合,検索の閾値は5あたり
が最適
それほど多くないキーワードで大抵の変更箇所は
見つけられる
閾値を変更しても,必要なキーワード数はあまり変化
しない
検索結果として得られた関数は全関数のうち20%
33
評価実験->考察
今回は,本当に変更すべき関数が分かる状態で
評価した
実際の開発では,recallもprecisionも出せない
答えを知らない状態での評価も行った
多少精度が落ちるが,それなりの結果が得られた
34
まとめ
変更要求からソースコードの変更箇所の絞り込
みをサポートするツールを開発した
実際の組み込みソフトウェア開発のデータを用い
てツールの有用性を評価した
今回の事例では,変更箇所として確認すべき部
分は全体のうち20%に抑えることができた
35
今後の予定
他の言語(C++等)にも対応
gccの中間コードを用いることも考えている
コンパイルが通ることが前提
機能追加以外の変更要求も考慮する
そろそろ修論を書く…
36
© Copyright 2026 ExpyDoc