• 検索結果がありません。

Sapidによるソフトウエア解析技法Ⅰ : Cプログラムの全体構造をとらえる

N/A
N/A
Protected

Academic year: 2021

シェア "Sapidによるソフトウエア解析技法Ⅰ : Cプログラムの全体構造をとらえる"

Copied!
19
0
0

読み込み中.... (全文を見る)

全文

(1)

彦 茅悟 十藤 斎 F ト ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー ー

Sapidに よるソフ トウエア解析技法 I

一 Cプ ログラムの全体構造 をとらえる一

は じめに ソフ トウエアエ学は,ソ フ トウエアの生産性 を向上 させ るための手法やツー ルを提供する。 ド キュメ ン ト生成 プログラム,設 計 ・開発支援 ツール,テ ス ト ツールや品質管理 プログラムなどが代表的なソフ トウエアエ学アプリケーシ ョ ンである。 これ らのCASEツ ールを実現するため,対 象 となるソースプログラ ムの構文解析やER(実 体一 関連図),DFD(デ ー タフロー図),UMLと いった モデルに基づ く解析が必要 となる。 Sapid(www.Sapid.org/)は 下流の解析 プロセス を効率的に実現す るツー ル ・プラッ トフォームであ り,LRや LLと いった構文解析の手法 を知 らな くて も,ソ フ トウエアエ学 ツールを実現す ることがで きる。本論文ではSapidの基 本的な使 い方 と,ソ フ トウエアエ学 ツールを実現す る例題 プログラムを示 し, 構造化やオブジェク ト指向 といった手法 に従 ってプログラムを理解するコース ウエアを提案する。 ソフ トウエア解析,保 守,管 理の観点か らプログラムを理 解 し,大 規模 プログラムの設計 における ドキュメン トを作成する例題 を用意す る。 第 1章 でSapidによるソフ トウエ アエ学 アプリケーシ ョンの開発戦略 を説明 す る。第 2章 でSapidのソフ トウエアモデルI_MODELと それに基づ くソフ トウ エアリポジ トリ ・データベースSDBを 用いる手続 きを,第 3章 以下でI―MODEL に基づいてC言 語のプログラムの構造 を理解 し,ソ フ トウエアエ学 ツールを実 現するプログラミングの手法 を説明する。

(2)

I Sapidア プ リケーションの開発戦略 ソフ トウエアは仕様書,ソ ース コー ド,関 数定義書,変 数表 といった ドキュ メ ン トやオブジェク トプログラム,テ ス ト用 プログラムなどか ら構成 される。 その中で関数定義書,変 数表 などはソース コー ドに直接対応するものであ り, オブジェク トコー ドやテス ト用 コー ドもソースコー ドか ら生成 される。仕様書 はソース コー ドを規定するものである。この ようにソフ トウエアはソースコー ドを中心 として構成 されると考 えることがで きる。 我 々の研究では,ソ ースコー ド中心か ら視点 を変 え,プ ログラムを細粒度 リ ポジ トリに分解 し,デ ータベース化 したデータを中心 としてソフ トウエアをと らえる。Sapidはソース コー ドを式,ブ ロ ック,名 前,演 算子 といった細粒度 リポジ トリに分解 し,デ ータベース化する。 ソース コー ドか ら生成 される資源 は,構 文解析 などで中間コー ドか らマシンコー ドまでのさまざまなレベルのデー タに変換することで得 られる。 コンパ イラ以外のアプリケーシ ヨンで構文解析 を行 うためには,解 析器 を個別 に作 る必要がある。Sapidはソース コー ドを細 粒度 オブジェク トのデータベース として扱 うので,解 析器 を作成す る必要はな く,ソ フ トウエアエ学 アプリケーシ ヨンを簡単 に作成することがで きる。 1.例 題 関 数 ドキュメン トの作成 SapidによるCASEア プ リケー シ ヨンの例題 として関数 ドキュメ ン トを作成 す る。関数 ドキュメ ン トは関数名 と型,属 するプログラム名やファイル名,関 数の説明,引 数の名前 と型,呼 び出 し位置,呼 び出 し関係 といった項 目か らな る。所属するプログラム,フ ァイル名の求め方は 工章か らIV章の例題で説明す る。関数の名前や型の取得 コー ドはV章 で説明する。引数,呼 び出 し位置,呼 び出 し関係 を求める例題 は続編で説明する。関数 ドキュメン トとして作成する デー タを以下 に示す。 1.プ ログラム,フ ァイルの名前の一覧 (正一Ⅳ章 を参照)。 2.関 数詳細情報 と関数定義一覧 (V章 を参照)。

(3)

口 ■ 田 酵 F 卜 ︰ ︰ ︰ E ︰ ︰ 卜 ︰ ︰ ︰ ︰ B ︰ ︰ ︰ ︰ ︰ B B ︰ i l l l l i l i ︲ l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l S a p l d によるソフトウエア解析技法 1 1 2 3 3 . 関 数 のパ ラメー タ定義 の一覧 (以下続編) 4 . 関 数 の出現 の一覧 5 . 関 数 の呼 び出 し関係表

H ソ フトウエアリポジ トリ・データベースs D B の実現と利用法

I ―M O D E L の 現在 のバ ージ ョンは,C言 語のプログラムを13のクラス と31の 関連で定義す る。一般的に,Cプ ログラムは関数宣言の集 まりであ り,プ ログ ラムや関数 はアルゴリズム とデータ構造の走義か らなる とされる。I_MODEL では,プ ログラムはファイルの集 ま りであ り,フ ァイルは外部変数や構造体, 関数の宣言の集 ま りとらえる。データ構造 は宣言オブジェク トとして,ア ルゴ リズムは式やブロックといったオブジェク トの組み合わせ として とらえる。 図① I―mOdd

(4)

I―

MODELの C言語の構造定義は大きく3つ の部分に分けられる。①プログ

ラム,フ ァイル,フ ァイル中の関数宣言や大域変数宣言といった宣言文により

表現されるプログラムの全体構造,② 制御文やブロック,式 といったプログラ

ムの基本構造,③ 変数や関数の名前や型,定 数,演 算子,及 びそれらの宣言と

いったプログラムの基本要素である。

本論文ではI―M O D E L の 基本的なクラス と関連 を説明 し,そ れ らを扱 う例題 を示す。プログラム ・オブジェク トを起点 として,関 連,オ ブジェク トの包含 関係か らファイル,関 数宣言部,宣 言子 を求める例題 を示す。 1 . S D B と l 中M O D E L 対象 となるソフ トウエ アか ら細粒度 ソフ トウエ アリポジ トリに基づ くソフ ト ウエ アデー タベ ースSDBを 生成 し,SDBの アクセス関数 を用 いて ソフ トウエ アエ学 ツールのアプリケーシ ョンを実現する。細粒度 リポジ トリは式や変数, ブロ ックといった構文解析 におけるオブジェク トに対応する。 本論文ではC プ ログラムの全体構造 を解析す る例題 をい くつか用意す る。Iぃ M O D E L に おけるCプ ログラムは,フ ァイルの集 ま りであ り,フ ァイルは大域 変数や構造体,関 数 などの宣言 とマクロの集 ま りである。マクロを処理するモ デル にはP ―M O D E L が あ る。整 数型 や文字型変数 の宣言 は クラス dedaradon ( 宣言) の オブジェク トとして扱 う。関数宣言や構造体,共 用体,列 挙体宣言, お よび代 入式 を含 む宣言 はクラス optおn 】ded(オプショナル宣言)の オブジェク トとして扱 う。 A.普 通 の宣言 型 名 宣 言 子 名 i n t i ; B.オ プシ ヨナル宣言 型名 宣 言子名 オ プシ ョナル部分 void main (int argc, char *argv[])

(5)

S a p i d によるソフ トウエア解析技法 I 図② I―mOdd図 (関数宣言部分) 2口 SDBの 内容 ソフ トウエ アデー タベースSDBの 扱 い方 について説明す る。SDBの 作成方 法 は参考資料 Iに のせ る。各 クラスは名前,サ イズ,種 類 といった属性値 を, 関連 は関数内での相対年置 を表すオフセ ットの属性値 を持つ。主なクラス と関 連,タ ーゲ ッ トプログラム とSDBサ ンプルを例示する。

(6)

主 なクラス

ile(フ ァイル) program(プ ログラム) declaration(宣言) optionaldecl(オプ シ ョナル宣言) declarator(宣言子) identifier(名前) expression(式 ) type(型 )

クラスの基本的な属性 識別番号 Name 名前 Length 長 さ(byte単位) Sort 種 類 主 な関連

progttflle ■le decl decl decl decl_opt decr_type ident ref decl ident deci_type

関連 の基本 的 な属性 関連の識別番号 0明l id 一方のオブジェク トo瑚1の識別番号 Obi2 1d 他方のオブジェク トo明2の識別番号 orset ファイルの先頭か らの位置 ターゲ ッ トプログラム / Ⅲ n a : n . c Ⅲ/ i n t d e c ( i n t i ) て 「e t u r n _ l i 〕 w o i d B a i n O モ i n t i , j , k i k・1: i ヨ1 : whil● (kく10)て i f ( 1 く1 0 ) て

1 乳

: : t i l i

} f o r ( j = 1 , j く4 i j + + ) て i n c ( l ) i 〕 } printf(“i=斉d j=】d k=括dttR",1,j,k) 【 int k=Oi

f o r ( j = l i l 若

l i ! │ つ

}

, r i n t f ( ` ` i = X d j = 営

d k ・

d t t n " , 1 , j , k )

} i n t i n c ( i n t i ) て r e t u r n + + i }

(7)

SDB例 1 ク ラス名ile オ ブ ジ ェク トID 属性 :名前 1048578 mainl.i 1048579 mainl.c 1048576 1048577 Sapldに よるソフ トウエ ア解析技法 I SDB例 2 関 連名ile_decl オブジェク トID l オブ ジ ェク トID 2 属性 :オフセ ッ ト 1048576 2097157 1048576 2097154 1048576 2097153 1048578 2097159 3 . 例 題 1 : プ ログラムl D の取得 一 l …M O D E L の スター ト地点 関数 s p d T a r g e t でクラスp r O g r a m ( プログラム) のI D つr O g 臼化りを求める。 この関数 はp r o g r a m ( プログラム) のI D を求めるときだけ用いる。クラスprOgram(プログラム) のI D は 一つであ り, そ こか ら全 ての オブジェク トをた どるこ とがで きる。 p r o g r a m ( プログラム) の I D を求めるプロセスで,SDBの データがすべてメモ リ上 にロー ドされる。 ① p r o g r a m ( プログラム)オ ブジェクトを求めるi spdTarget ← program id ② 関数プロ トタイプ A . s p d T a r g e t ―プログラムI D を求める プログラムID← spdTarget(モデル名,タ ーゲ ットプログラム名)

型 SpdObjld char* char*

属性値 型 cha体

← spdGetName(オ ブジェク トID)

SpdO朗 ld

(8)

関数利用例 arget 一プログラムIDを 求める ③ A. B.spdGetName ― オブジェク トの名前 を求める pAn甘("%フ ァイル名 は%-14s¥n'',spdGetName(program_id)); ④ サンプルプログラム1 -プ ログラム名を求める /8 ' pr08『"・Cプ ログラムlDを取得 3/ 3inctude くstdioB h〉 linciude くSapid/Sapid,h〉 int ttainOt char ttarget_prograB; /字 対 象プログラム Ⅲ / SpdObj id proぼraLid i /t プ ログラムid t/

/8対 象プログラムのオブジェク ト pro8ra口を得る。―〉ブログラムid'/

if((pragraLid i S'dTarget C i―日Ode r,tar8et_p『ograB))=SAPlD‖ 0性lD)〔 8pdErrorExitCプログラム ず斉sギ はみつかりません.・,larget_progra日)i 〕 /1対 象ブログラムのオブジェク トprOgra日の名前を出力 Ⅲ/ printff営 ファイル名は斉-118学n・,spdCetttme(prograLid)): return (EXIT_SUCCESS): ) 田 フ ァイル名 を求める 一 関連 からオブジェク トをたどる I ぃM O D E L に おけるC プ ログラムはファイルの集 ま りである。本章では関連 か らプログラム, フ ァイル, 宣 言 といったオブジェク トを求める方法 を説明す る。オブジェク トはI D 番号で一意 に識別 される。オブジェク トI D を取得す る た め に , s p d G e t A R e 1 0 朗‐S p d G e t R d O 明と い っ た 関 数 が 用 意 さ れ て い る 。 引 数 は 参 照元のオブジェク トI D と関連名,条 件である。 1 . 例 題 2:フ ァイルIDを求める l 一 関連prOg…宙l e か ら直接求める 関連prOg―n l e ( プログラムーファイル)と プログラムIDか ら対象オブジェク トの フ ァイルIDを求める。関連 を用 いてオブジェク トを求める方法 には,直 接求 める方法 とカーソルを利用する方法がある。直接求める関数 spdGetARdO明は,

(9)

Sapidによるソフトウエア解析技法 1 129 対 象 オブジェク トが一つ しか ない場合 と,条 件 に よ リー意 に決 まる ときに用 い る。対 象 オブ ジェ ク トが複 数 あ る場合 は,カ ー ソル を利用 す る spdGetRe10朗関 数 を用 い る。 ① 対 応 オブジェク トI D を直接求める :spdGetARdO朗 ← 0明Lid OB」1-OBJ2(1対 1) ← obi2 1d 関数 プロ トタイプ s p d G e t A R d O 朗 ― オブジエク トI D を求 め る

オブ ジェ ク トIDl← spdGetARe10朗 (オブ ジエ ク トID2, 関連名 (OB」1 0BJ2),条 件)

型 Spdottd SpdObjld char* char*

③ 関 数利用例 プ ログラムIDか らフ ァイルIDを 求め る キー prog_ld Program― Flle(prog_nle) ← nle id A.spdGetARdO朗 ― オブジエク トIDを 求め る ② A

村le_id =spdGetARetO朗 (prOg_id‐ ''prog_付le" , "any");

④ サ ンプル プログラム 2 フ ァイル名 を求める I

/,

' filに 1.c プ ログラムを構成するファイルの名前を取得 (1) を/

tinctude くstdio.h〉 ,include くSapiば/SapidB,〉 int BainO〈 char ttarget_proera日; /3 対 象プログラム t/ 3/ 3/ と 同 じ) SpdObj!d file_id; /1 フ アイル id

fitq_id=spdCetARe10bj(progra■ id,"prog―filo","anyり , printff宮 ファイル名は斉-143竿n",8pdcetttaRO(filLid)): return (EXtT_SuCCESS),

SpdObj id pro8raLid i /t プログラムid プ ロ グ ラム I D を 求 め る コー ド ( サ ン プ ル 1

(10)

2.例 題 3:フ アイルlDを求 め る I ― カーソル を使 用 複 数 の オ ブ ジェク トが対 象 の とき,カ ー ソル を用 いて順番 にアクセスす る。 spdGetRdOttinl関数 は対 象 オ ブ ジ エ ク トの ビュー を作 成 し,カ ー ソルIDへ のポ イ ン タ を返 す 。関数 spdGetRdO朗で カー ソル を移動 させ ,順 番 に対 象 オブ ジェ ク トIDを 取得 す る。SpdGetRdO明の ようにカー ソル をパ ラメー タとす る関数 は, 最後 にSAPID_NON_IDを 返 す。 ① カ ーソルの利用 :spdGetRe10明 娩あけ関数でカーソルを初期化 し,ビ ユーを作成する。spdGetRe10明関数でカーソル を移動 させ,対 象オブジエク トIDを順番 に取得する。 ← 0巧l id OBJl-OBJ2(1京 寸n) ← 0瑚礼id ② 関 数プロ トタイプ A . s p d G e t R d O t t i n l ―カーソルの初期化 カー ソルI D SpdCursor* ← spdGetRe10ttinl(ォ ブジェクトIDl,関 連名,条 件)

型 spdObjld char* char*

B.spdGetRdO明 一 カー ソルの本U用 ③ 関 数利用例 ↑ file id A , s p d G e t R e 1 0 t t i n l ―カ ー ソ ル の 初 期 化 オブジェク トID2 spdGetReiObj(カーソル) 型 spdOblld SpdCursor

(11)

Sapidに よるソフ トウエア解析技法 1 131 B.spdGetRdO朗 一 カー ソルの利用 while((‖e_id=spdGetRe10朗 (lle_csr))!=SAPID_NON_lD)│ コー ド │ 日 F 卜 ︰ ︰ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ Co spdFreeCursor ―一カーソルを閉 じる spdFreeCursor(付 le_csr); Ⅳ 関 数名 の取得(1) 一 オ ブジ ェク トの 出現 をチ ェック 関数 宣 言 の ク ラス は opdon】ded(オ プショナル宣言)で あ る。多 くの オブジェ ク トが一 つ の オブジェク ト (ここで は フ ァイル)に ぶ ら下が ってい る ときは, オ ブ ジ ェ ク トの出現 (オカ ン レンス)を 求 め る関数 spdGeundudedoccを利 用 す る。 ④ サ ンプルプログラム 3 フ ァイル名 を求め る 工 /忠 ' fil L2.c プ ログラムを構成するファイルの名前を取得 (2) 1/

t irBc t ude くstdio.h〉 3include くSapid/Sapid.h〉

i n t m a i n O 〈

char ttarget_pragra口 ; /3

S p d C u r s o r t f i l e _ c s r : / t SpdObj ld file_id i /1

SpdObjld pro8ra口_id i /8

対象プログラム Ⅲ / フアイルカーソル 1/ フアイルid t/ ブログラムi d l /

/t対 象プログラムのオブジェク ト progra口を取得する。1/ target_progra冊 = 8日uCetAP「ograntta日10i

l“

:::群

;提

liFボ

影鉱概!F'さ

鍔涼

難威FF滋

,1梢

料!!冊

li

/3フ ァイルカーツルの機定3/

file_csr i spdCetRe10bjinit(prograLid,"proLfile口 ,'any'): /,オブジェク トfillのlDをほ書に取得Ⅲ/

whill ((file_id i spdCetRe10b〕(file_csr)) != SAPID_は0叫_lD) / 1 オブジェク トf i l e の名前(属働 を取得3/ w t t f t t F 目 のファイル名はH 輸 神 ぃ 的 陥 帥 町 例 i

spdFreeCursor(file_csr);

(12)

① オ カレンス ・カーソルの扱い方 :spdGeundudedocc オカレンス ・カーソルの利用方法はオブジエク トカーソルと同 じである。/ / 4 うけ関数 で カーソルを初期化 し,spdGeundudedocc関数でカーソルを移動 させ, 対 象 オブジエ ク トの出現 を順番 に取得する。 ile id O B J l ← 抗担」d 位 位オブジェク トのI D )

∪ …的2_occ

② A. 関数 の プ ロ トタ イ プ spdGetinciじdedOccinit 一オカレンスカーソルの初期化

カーソルID ← spdGetindudedOccintは le_id,対象クラス名,上 位オブジェク トのID)

型 SpdCursor* SpdO瑚 ld Chatt char*

B. spdGetincludedOcc ―オブジェク ト出現 を求める オ カ レンス ← spdGetinciudedOcc(カ ー ソル) 型 SpdObjld spdcursor ③ 利用例 醐 d ― m ぉ d

OptionalDecl(dect occ) Flle⊃ Decralation

F u n c h o n 2 S t r u c t l l n t l l n t 2

d e c i _ o c c D O t t C t i d

A . s p d G e t i n d u d e d O c c l n l ―オカ レンス カー ソルの初期化

deci_csr = spdGetinciudedOccinit(file_id‐ "deciaration" , file_id);

B. spdGetincludedOcc 一 オブジェク ト出現 を求める decl_occ =spdGetinctudedOcc(deci_csr);

(13)

■ ■ ■ ■ F r i l l i l l l l l Sapldに よるソフ トウェア解析技法 I C. オ カ レンスか ら関連IDを 求め る

while((deci_occ=spdGetinctudedOcc(deci csr)).rela8onid != SAPID_NON_lD) │ コー ド │ カー ソル を利用 して対象 となるオカ レンス 」e c r θc c を順番 に取得す る。 オカ ンレン ス J e と0 0 C は構造体S p d O c c 型変数であ る。 カー ソルの終点 ( S A P i 叱N O N 」D ) を求め る た め に, オ カ ン レ ンス J e c r θc c の 関連I D に ア クセ スす る。 関連I D は 構 造体 変 数 ④ サンプルプログラム4 オプシ ヨナル宣言 のオブジェク トIDを 求める。 /1 や O p t l , c オ プ シ ョナル宣言 のオ ブジェク トIDを 求 める。 3/ linclude くstdio.h〉 =include くSapid/Sapid.h〉 i n t B a i n ( i n t i r g c , c h a r t a r g v 口) ( SpdOcc decl_occi SpdRel ident_reti

S,dCur80r tfill_csr, 中decl_csr: char Ⅲtarget_pragra口;

S p 1 0 b j l d f i l 生id,proLid,decLid,ret_id: target_progra日 = SRuCetAProgratta口80:

if (く,roLid = SpdTarget C i…Bodel', target_pragra日)) =i SAP!D_出OH_lD) 〈 s p d E r r o r E x i t C P r a g r a ロギ1 8 学" n o t f O u n d . , t a r g e t _ p r a g r a O ; ) /, progra日 ―〉 fit● 1/

戦:科

相と

瑞品選

1群

:営

,,灘

&蛇

OUDて

8為FreeC町的荒 lE呂 ず “劇 Hni 〕 s P d F r e e C u r s o r ( f i l L c s r ) i return (EXlT_SuCCESS): J e C とθC C の メ ン バ r d a J o n 旧 に 格 納 さ れ て い る 。 D,オ カ レンスカどらオブジェク トIDを 求める

(14)

V 関 数名 を求 め る(2)― クラスの属性値 の取得 サ ンプルプログラム 4で は,各 ファイル中のopdonttded(オプシヨナル宣言)のID を順 番 に求 め た。 この 中か ら関数 で あ る もの を選 ぶ 。 o p d o n 】d e d ( オプシヨ ナル宣言) の属性 ・種類 はo r t ) で, 関 数 で あ る もの を取得 す るため に s p d G e t A t t r V t t i n t 関数 を用 いる。関数 s p d G e t N a m e は, 属 性 ・名前 を求めるために用いる。 表 1 宣 言 オブジエク トの種類 マ クロ定義 宣言の種類

DECL VARIABLE variable 変 数

DECL MIEMIBER mettber メ ンバ ー

DECL FUNCDEF funcdef 関 数

DECL PROTOTYPE prototypeプ ロ トタイプ

DECL TAG struct,union,enum,tag

構 造 体 等 の タグ

DECL TYPE type 型

DECL ENUMERATOR enumerator列 挙子

DECL PARMITYPE pointer,arrayポ インター等

名 前 や型 と直接 の 関連 を持 つ ク ラス は d e c h r a t o r ( 宣言子) で あ る。 関数 の declaration(宣言)か ら, 関連 decl_decl(宣言一宣言子)に よ りdeclarator(宣言子)を求め る。関数名,関 数の型 は,オ ブジェク ト遇entrier(名前),type(型)であるので, declarator(宣言子)か ら関連declident(宣言一名前),decl―type(宣言一型)により得 る。

① 属 性値を求める

O B 」1 Attribute

(15)

刊 Sapldに よるソフ トウエア解析技法 I ② 関数のプロトタイプ

A.spdGdAttrVttht―一般的な属性値取得関数

③ 関 数利用例 Optionaldecl SOrt:DECL_「 UNCDEF

← decl occ.0巧eCtld ソー ト:値 Flle Name:mainl.c ← nle id 名前 m a i n l . c A,spdGetAttrVttint―一般的な属性値取得関数

甘 (spdGetAttrValint(deci_occ口 o朗 eCtid中 "SOrt")==DEC性 FUNCDEF)│

1 . オ ブジェク トの位置 を求める 一 関連lD,属 性オフセッ トの取得 オブジェク トの出現の位置は関連の属性 ・オフセ ッ トに格納 されている。オ フセ ッ トは各関数の定義文の先頭か らのバイ ト数であ らわされる相対位置であ る。 なお,関 数定義部 のオフセ ッ ト (関連deci fileに格納)は ,各 ファイルの先 頭か らの相対位置である。 ① 対 応 オブジェク トとの関連IDを 求め る :spdGetARel ← Obil id ← o萌2_id 関数 プロ トタイプ spdGetARd ―関連 の取得 ② A 属 性 値 ← spdGetAttrValint(オ ブ ジェ ク卜I D , 種 類) char* 型 int SpdOttld 関連 型 SpdRel ← spdGetARel(オ ブジェク トID l,関 連名,条件 )

(16)

B. spdGetOttset 一 オフセ ッ トの取得

③ 関 数利用例

← decr id

ident rel.relationid

オ フセ ッ ト ← spdGetOttset(関 連ID) 関連ID← 関 連.relationld

型 int SpdRelld 構造体SpdRelの メンバrelationld

identiner

A.spdGetARd 一 関連IDの 取得

idenL_rel =spdGetARel(decr id, "decl_ident" , "any"): Bc spdGetOttset 一オ フセ ッ トの取得 printf("OFFSET:° /。-6d¥n" ‐ spdGetOttset(ident_rel.relaJonid)); 図③ オフセツト例 l pγοg_"ιθの オ フセ ッ ト位置 /ネ main口c ネ/

vd旨

1需

;♀

令肋

∽け

αθC ι」勢 θのオフセ ッ ト位置 ソース コー ドの中でオフセ 部 は関連 n l e d e c l のオフセ ッ で もある。

ットの位置を説明する (図③)。関数宣言の先頭

卜位 置 であ る とともに d e c L t y p e のオ フセ ッ ト位 置

(17)

■ 臨 卜 r r r , ︰ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ ︱ Sapidに よるソフ トウエア解析技法 1 137 ④ サ ンプルプログラム5 -関 数名,型 を求める /t Ⅲ f u n c d e f t c 関数 宣言 のオ ブ ジェク トID、 関数名 、型 を求 める。 3/ 3 i n c l はd e くs t d i o . h 〉 3inctude くSapld/Sapld.h〉 i n t t t a i n ( i n t a r g c ・ c h a r , a r g v 日) 〈 SpdOcc decl_occi S p d R e l i d e n t _ r e l i spacursOr tfi18_CSr, 3deCi_csri Char ttarget_progra日:

SpdObjld file_id, pro8_id, decr_id, rel_id; Target_progra日=8ロロGetAProgr‖硝aneO:

if(く,roLid i SpdTar=et C!―EOde r,target_pragra回))宮ヨSAPlD出0性_lD)〈 spdErro『ExitCPrograロ ギ斉sギ not fOund.', target_progra日): 〕

file_csr i s,dCetRe10bj ini t(proLid,"proLfila',"any')i 口h i l e ( ( f i l L i d i s p d C e t R e 1 0 b j ( f i l 生c s r ) ) 卜 S A P i L ‖O L I D ) 〈

dect_csr , spdCettncludedOccinit(file_id, "deciaraticn', fil●_id): whilo ((decl_occ i spdcetinctudedOcc(dect_csr))。relationid i宮

S A P I D _ 田0 性l D ) 〈

i f ( s p d C e t A t t 「V a l i n t ( d e c l コc c . o b j e c t l d , " 8 0 r t 口) = = D E C L F U t t C D E F ) て decr_id i spdCetARe10bj(deci_occ.Obj eCtid, "decl…deci','any"); if(deCLid!宮 SAPlD出 0性 lDて

ident_ret = spdCetARel(decr_id, "deci_ident",・ iny');

p r i n t f f F U ‖C T 1 0 H : 斉- 1 0 8 F l L E : 】…148 0FFSET:軍- 6 d t t n ' , spdClt出8日0(ident_rel.objectld), s p d C e t t t H ●( d e c l _ o c c 口f i l e i d ) , spdCetOff3et(ident_rel.relatianid)): 〕 } } 8 , d F r e e C u r s o r ( d e c i _ c s r ) ; 〕 spdFreeCursor(file_csr): return (EXtT_SUCCESS): } [参考資料 l Sapid利 用方法] ① SDBの 作成方法 A.命 令プロ トタイプ 鍋 4 フ ァわ レ名 円 ス 同 司 プログラ乾 B . 利用 ケJ l p r o m 飼# 銅 M t t L c 血 c 司 航 n

(18)

138 彦 根論叢 第 325号 ② includeファイル Sapidの基本関数 を利用する : くSapid/Sapid.h> その他,各 ライブラリに対応するincludeファイルがある。 ③ コ ンパイル方法 ① . 0 フ ァイルの作成

[prompt]# gcc-1/uSr/xll R6/inctude-1/inciude ―Dlinux―D__i386__ ―DX LOCALE ―DSAPID_AR4 -1/usr/10Ca1/Sapid/inCtude ―c funcdef口c―o funcdef口o

② 実 行形式ファイルの作成

[prompt]幹 gcc 一〇 funcdef ―L/usr/10Ca1/Sapid/1ib ―L/usr/Xll R6/1ib funcdef口o ―iSapidStr―iSapidAR4

なお簡単 にコンパイルするためにはmakefileを用いるか,sapid config命 令 を利用する。

Prompt]# gcc funcdef口 c `sapid―conng` ―o funcdef

[参考資料 2 Sapid関数について] ① 名 前の規則 A, spdGetARe10朗 , SpdGetRe10ttinl ② 主 な関数 spdTarget: プ ログラム (ID)を 求める spdGetAtrVttint: オブジェク トの属性 を求める spdGetName: オ ブジェク トの名前 を求める spdGetRel: 関 連 をもとめる spdGetOttseti 関 連 のオフセ ッ ト (位置)を 求め る spdGetARdO朗: オ ブジエク ト (ID)を 一つ求める spdGetRe10叩nk: オ ブジェク ト (ID)を 求めるためのカーソルの設定 spdGetRe10朗: カ ーソルによリオブジェク ト (ID)を 求める spdGetindudedOccinl: オカ レンス を求めるためのカーソルの設定 spdGetinctudedOcc: カーソルによリオカレンスを求める。 SAPID関 数 取得 関数 [一つ取得] 参 照 オ ブ ジ ェ ク ト [カーソル初期化]

Get [A] Re10朗

B.spdGetinctudedOccint

SAPID関 数 取得 関数 [一つ取得] 出現 を対象 [カーソル初期化]

(19)

Sapidによるソフ トウエア解析技法 1 139 [参考文献] (1)山 本 晋一郎,阿 草 清滋 (1995)「細粒度 リポジ トリに基づいたッール ・プラッ トフォー ム とその応用」 情報処理学会 ソフ トウェアエ学研究会,Vol.102,No.7,pp.37-42 (2)大 橋 洋貴,山 本 晋一郎,阿 草 清滋 (1999)「ソフ トウェア空間を トラバースする柔軟 な検索」 日本 ソフ トウェア科学会第16回大会論文集,pp.149-152 (3)斎 藤 邦 彦 (1999)「ソフ トウエアエ学 ツールプラッ トフォームSapid」彦根論叢第310号 pp.183-199 (4)カ ーニハ ン, リッチー (1983)「プログラム ング言語C」 共立出版株式会社

参照

関連したドキュメント

劣モジュラ解析 (Submodular Analysis) 劣モジュラ関数は,凸関数か? 凹関数か?... LP ニュートン法 ( の変種

不変量 意味論 何らかの構造を保存する関手を与えること..

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

解析の教科書にある Lagrange の未定乗数法の証明では,

IALA はさらに、 VDES の技術仕様書を G1139: The Technical Specification of VDES として 2017 年 12 月に発行した。なお、海洋政策研究所は IALA のメンバーとなっている。.

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計