滋賀大学経済学部研究叢書第
3
8
号
Sapid
によるソフトウェア解析技法
斉 藤 邦 彦 著
滋賀大学経済学部研究叢書第
3
8
号
Sapid
によるソフトウェア解析技法
斉 藤 邦 彦 著
まえがき
コンビュータが普及し、誰もがインターネットを利用できるようになった背
景には、ハードウェア技術、通信技術、そしてソフトウェア技術の発展がある。
しかし半導体や電子デバイス、ネットワーク機器の急速な発展に比べ、ソフト
ウェアの進歩はあまり目立つものではなかった。
ソフトウェア技術には
OS
ゃプログラミング言語、ソフトウェア工学といっ
た領域があり、ソフトウェアの開発、利用、検証を対象とする。ソフトウェア
工学はソフトウヱアの生産性を向上させるための手法やツールを開発するため
の 方 法 論 で あ る 。 ま た ソ フ ト ウ ェ ア の 生 産 性 を 向 上 さ せ る た め の ツ ー ル を
CASE (
C
o
m
p
u
t
e
r
A
i
d
e
d
S
o
f
t
w
a
r
e
E
n
g
i
n
e
e
r
i
n
g
)
ツールと呼ぶ。
CASE
ツール
はソフトウェアの設計・開発、プロジェクト管理、
CVS
などの構成管理、
ドキ
ュメント管理、テストや品質管理といった作業・工程を支援する系である。
CASE
ツールプログラムの開発プロセスでは、対象となるソースプログラム
の構文解析が必要となる。本著で扱う
S
a
p
i
d
は、下流プロセスの解析系を効率
的に実現するためのツール・プラットフォームとして開発された。
S
a
p
i
d
は
C
や
JAVA
言語で書かれたフログラムを細粒度のリポジトリレベルでデータベー
ス化し、そのデータにアクセスするルーチン
(
A
P
I
)
を提供する。ソフトウェ
ア・リポジトリのデータベースにアクセスすることで、
LRや LLといった構文
解析の知識がなくても
CASE
ツールを簡単に実現できるようになる。
S
a
p
i
d
は名古屋大学大学院工学研究科の阿草清滋先生のもとで始まり、愛知
県立大学情報科学部山本晋一郎先生を中心に開発され、日本のソフトウェア工
学研究の成果として、またオーフンソースムーブメントのひとつとして多くの
利用者を集めている。
S
a
p
i
d
の技術は、
レガシーな技術の集大成という側面をもっ。ソフトウヱア
工学の実際の現場での応用は、技術開発サイクルの速さと比べ、遅々たるもの
である。
S
a
p
i
d
は「実用的
J
で「実効的」な技術をめざしている。技術開発サ
イクルの速さと、その普及の遅さのギャップを埋め、さまざまな方法論やツー
ルを実際の開発現場で応用することを可能とし、関連する支援環境を実現する。
ソフトウェアの再利用をはじめとして、構成管理、
XP
といったプロジェクト
管理技術、
XML、UML、デザインパターン、分散オブジェクト管理等のソフ
トウェア工学技術との連携が期待できる。
本書は
S
a
p
i
d
に関連する著者の論文をもとに、
S
a
p
i
d
の全体像を明らかにし、
実際に利用するユーザの便宜を考えて加筆、再構成したものである。
S
a
p
i
d
の
基本的な使い方を第
I章で、また第 2章、第 3章でソフトウェア工学ツール実
現の例題プログラムをいくつか示す。第
4章ではソフトウェア評価の基礎技術
であるソフトウェアメトリックス、第
5章ではソフトウェア解析のためのモデ
ル
SDA、 第 6章ではソフトウェアの脆弱性、リスク分析の観点からプログラム
を解析する手法を
S
a
p
i
d
で実現する。
近年のインターネットの普及により、
WEBプログラミングが主流となり、
ビジネスモデリングなど上流工程への注目が高まっている。著者の経営情報シ
ステムや意思決定支援システムの研究と、
Sapid
をはじめとするソフトウェア
工学研究の成果を橋渡しする研究として第
7章「経営情報システムとビジネス
モデリング技法」を加える。
(初出)
第
1
章 、 第
2
章
r
S
a
p
i
d
によるソフトウェア解析技法。
-c
プログラムの全体
構造をとらえる』彦根論叢
325
号
(2000/6)
第
3
章、第
4
章
r
S
a
p
i
d
によるソフトウェア解析技法「ーソフトウエア・メト
リックスの作成』彦根論叢
327
号
(2000/10)
第
5
章、第
6
章
r
S
a
p
i
d
によるソフトウェア解析技法
J
ーソフトウェアのリス
ク分析(1)一
(
2
)
J
彦根論叢
333
号
(2001/10)
、彦根論叢
335
号
(
2
0
0
2
/
3
)
第
7章『直接実現可能な経営情報システムのモデリング手法の提案』彦根論叢
323
号
(2000/1)
最 後 に 、 本 書 と 関 連 す る 研 究 に 関 し て 、 多 大 な ご 指 導 、 ご 助 言 く だ さ っ た
方々に感謝を申し上げます。名古屋大学大学院工学研究科でご指導を
I
貞いた指
導教官の名古屋大学大学院工学研究科情報工学専攻教授稲垣康善先生、名古屋
大学名誉教授福村晃夫先生、また研究のご指導を頂いた名古屋大学大学院工学
研究科情報工学専攻坂部俊樹先生、東北大学大学院工学研究科電気・通信工学
専攻阿曽宏具先生に感謝を申し上げます。
本書の作成と関連する研究の基礎となった
Sapid
プロジェクトのリーダーで
ある名古屋大学大学院工学研究科阿草清滋先生、フロジェクトの推進者である
愛知県立大学情報科学部山本晋一郎先生、フロジェクトの中心メンバーである
和歌山大学システム情報学センタ一吉田敦先生、システム工学部福安直樹先生、
南山大学数理情報学部蜂巣吉成先生、愛知県立大学情報科学部粕谷英人先生に
感謝を申し上げます。
また、経営情報システムに関連する研究に関してご助言を頂いた名城大学都
市情報学部尾碕員先生、流通経済大学経営情報学部蜂谷博先生、関西大学総合
情報学部山内昭先生に感謝を申し上げます。最後に、本書の出版の機会をあた
えてくださった、滋賀大学経済学部の先生方に感謝を申し上げます。
2003
年
3
月
斉藤邦彦
目 次
まえがき
第
1章
ソフトウェア工学ツール開発と
Sapid
I
ソフトウェアリポジトリ・データベースSDB
の実現と利用法...1
H
クラスprogram(
プログラム)、f
i
l
e
(ファイル)、d
e
c
l
a
r
a
t
i
o
n
(宣言)•...•.•..4
E
クラスd
e
c
l
a
r
a
t
o
r
(宣言子)と属性値の取得一...•..•....
.
.
.
.
.
.
.
.
.
1
0
W
クラスo
p
t
i
o
n
a
l
d
e
c
l
(オプショナル宣言)・・・…・・・・・・・・・・一一一....
.
.
.
.
.
.
.
.
1
4
第
2
章
ドキュメントの作成手法
I
関数ドキュメントの構成-…...一・…..・...1
9
E 関数定義に関する情報の取得……ー…………・・・………1
9
E
変数、定数、演算子に関する情報の取得………ー………2
6
W
関数呼び出し情報を求める ・・・・・・・・・・・・…・・・・・・…・・・・・・・・・・・・・・・・・・・・・・・・・・…...3
0
第
3
章
プログラムの構造を解析する
I
プログラムの制御構造(ブロックと式) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・….
.
.
3
7
E
クラスe
x
p
r
e
s
s
i
o
n
と式の構成 ・・・・・・・・・・・.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
9
m
クラスb
l
o
c
k
...…・ ・・・・・ ・・・・・・・・・…・・・・・…44
W
変数のトレースと制御構造・・・・・・・・・・・・・・・・・・・・・一...一.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
9
第
4
章
ソフトウェア評価技法とメトリックス
I
ソフトウェア・メトリックス ・・・・・・・・・・・・・・・・・・・・ ・・・一.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
E 集計によるメトリックス ・・・・・ー・・・・・・・・・・・・・・・・・・・・・・・・….
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
8
E
複雑さを表現するメトリックス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ー・・・・・・・・・・・・・・・6
0
IV ソースコード・メトリックスの利用・.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
9
第
5
章 制 御 構 造 と 依 存 解 析
-SDA
モデル
1 SDA
モデル ・・・・・ ・・・・・・・・ ・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・7
5
I
I
s
t
a
t
e
m
e
n
t
モデゾレ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・7
6
m
SDA
モデルと制御フロー ・・・・・・・・・・・・・・・・・・・一... ...8
1
N SDA
モデルとデータ依存解析-・・ ・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・ ・・・・・8
6
第
6
章ソフトウェアのリスク分析
I
リスク分析の実現 ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・...9
3
H
バッファオーバーフロー ・・・・・・・・・・・・・・・ ・・・・・・・ ・・・・・・・・・・・・ ・・・・・・・・・・・・・・・9
6
E
バッファオーバーフロー(
2
)
・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・.1
0
0
N リスク分析ツールの実装 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1
0
6
第
7章経営情報システムとビジネスモデリング技法
J
a
p
i
d
、
Dapid
、
D
i
p
a
s
I は
じ
め
に
一
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
H
モデリングのアプローチ・・・・・・・・・・・・・ ・・・・・・・・・・・・ ・・・・・ ・・・・・ ・・ ・・・・・・・・・・・1
1
3
E
モデリングの実現...・・・・1
1
5
N モデリング例...1
1
7
V D
i
p
a
s
モデ]レ設計とアプリケーションの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1
2
7
参考文献 ………...………...………・・………ー………・…………・・1
2
9
APPENDIX
A
.
基本データ型とAR
関数・・・・・・・・・・・・・・・・・・...一.
1
3
6
APPENDIX B
.
解析対象プログラムと実行結果の関係 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1
3
6
APPENDIX C
.
S
a
p
i
d
サンプルプログラムのF
u
l
lV
e
r
s
i
o
n
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
4
9
第l章 ソフトウエア工学ツール開発と
S
a
p
i
d
第
1
章
ソフトウェア工学ツール開発とSa
p
i
d
I
ソ フ ト ウ ェ ア リ ポ ジ ト リ ・ デ ー タ ベ ー ス
SDB
の 実 現 と 利 用 法
S
a
p
i
d
(
S
o
p
h
i
s
t
i
c
a
t
e
d
A
P
I
s
f
o
r
CASE t
o
o
l
D
e
v
e
l
o
p
m
e
n
t)は細粒度ソフトウ
ェアリポジトリに基づく
CASE
ツール・プラットフォームであり、ソフトウエ
アモデル
(I-MODEL)
に基づいたプログラム情報をソフトウェアリポジト
リ・データベース
(
S
D
B
)
中に保持する。
図1.
I
-
m
o
d
e
l
匂'凶d“
b同 冊 鴫t神 .U ~~~/îg酔誼 1 掴J込L s.".~官咽,聞"帽掴旬 '掴4剖'h回U胃市0恥.
.
tU叫u崎,司刻 '摺?叫x白町:,泊92
S
a
p
i
d
によるソフトウエア解析技法
現在のパージョンの
I-MODEL
は
、
C
言語のプログラムを
13
のクラスと
31
の関連により定義する。プログラムはファイルから構成され、ファイルは外部
変数や構造体、関数の宣言から構成されるといったようにプログラム全体をク
ラスと関連によって定義する。
I-MODEL
を
3つのカテゴリーに分け、詳細に解説する。 3つのカテゴリー
は、①プログラム、ファイル、ファイル中の関数宣言や大域変数宣言などフ。ロ
グラムの全体構成、②制御文やブロック、式といったプログラムの基本構造、
③ 変 数 や 関 数 の 名 前 や 型 、 定 数 、 演 算 子 と い っ た プ ロ グ ラ ム の 基 本 要 素 で あ
る
。
本章では、基本的なクラスと関連を説明し、
program
オブジェクトを起点と
して、オブジェクト聞の関連や包含関係をたどる方法を示す。第
2章、第 3章
で、変数や関数の名前や型、定数、演算子といったプログラムの基本要素、制
御文やブロック、式といったプログラムの基本構造を解析する例題を用意する。
4章以降はソフトウェアメトリックスの求め方などの応用プログラムを作成す
る
。
l章
ファイル、関数、変数の官言剖
L
官言子等のオブジェクト
2章
関数の官言、変数、関数、定数、演算子
3
章
ブロックや式、制御構造の構文解析
4章
ソフトウェアメトリックス
5
章
SDA
モデル
6
章
ソフトウェアのリスク分析
7章
ビジネスモデリング
[本書の構成]
ト1 SDB
と
I-MODEL
Sapid
アプリケーションは、
SDB
のアクセス関数
(AR4)
を用いてソフトウ
エアリポジトリ情報にアクセスすることで実現する。対象となるソフトウェア
からコマンド
"
s
d
b
4
"
を用いて、細粒度ソフトウェアリポジトリに基づくソフト
ウェアリポジトリ・データベース
SDB
を生成する。
SDB
の各クラスは式や変数、ブロックといった
C
言語の構文解析オブジェク
第l章 ソフトウエア工学ツール開発と Sapid 3
ト に 対 応 す る 。 そ れ ぞ れ の ク ラ ス の オ ブ ジ ェ ク ト は 名 前
(name)
、 サ イ ズ
(
l
e
n
g
t
h
)
、種類
(
s
o
r
t
)
といった属性値を持つ。関連は関係する
2
つのオブジ
エクトの
I
d
とファイル内での相対位置を表すオフセット
(
o
f
f
s
e
t)値を持つ。
Hle I program(プログラム)Id町laration(宣言)I optionaldecl(オプショナル宣言) 舵:la附 r(宣言子)I ident伽 〈 名 前 Iexpression(式 Itype(型) 1・2
SDBの内部構造
[主なクラス11
福喜一
名前 長さ(byte単位) 種 類 一方のオブジェクトobjlの識別番号 他方のオブジェクトobj2の識別番号 ファイルの先頭からの位置 [関連の属性]ソフトウェアデータベース
SDBの内部構造を、サンプルのプログラムを用
いて説明する。ターゲットとするプログラムの
I-model
による表現の一部と、
対応する
SDBデータの内容を例示する。
解析対象プログラム
1-1 /‘ファイル名 main.cプログラム名 main */?
州
ntargc, 山 内rgv[]) char message[]="Hello world!¥n"; printf("%s",me田age);4
S
a
p
i
d
によるソフトウェア解析技法 プログラム名main ↓proιfileI
nam~叩n
川巴田町lamI l ファイル名 mam.c 日le name: maln │ ↓ 日le_decl │ 関数定義名 Id回clarati叩 '1sort:DE氾L FUNCDEF 図2. I-modelによる表現 オブジェクトIdI
属性:so抗 ロlaln 2097152 DECL_P組 AMETER [SDB例1 クラス名program] 2097153 DECL_P~ETER オブジェクトId 1048576 1048577 2097154 DECL_FUNCDEF 2097155 1 D配L_NO剛 AL [SDB例3 クラス名 declarationl [SDB例2 クラス名目le] オブジェクトId1I
オブジェク卜Id2I
属性・オフセット。
11048576 113。
I
1048577I
13 [SDB例4 関連名proι日lel オブジェクトId1I
オブジェクトId2I
属性:オフセット 1048576 1 2097155 1 13 [SDB例5 関連名file_declJE
クラス
program
(フログラム)、
f
i
l
e
(ファイル)、
d
e
c
l
a
r
a
t
i
o
n
(宣言)
Cプログラムの全体構成を解析する。 Cプログラムはファイルの集合として
構成される。クラス
program
のオブジェクトを基点に関連をたどり、クラス
f
i
l
e
、
d
e
c
l
a
r
a
t
i
o
n
の各オブジェクトを求める。オブジヱクトは
I
d
番号で一意に
識別される。クラス
p
r
o
g
r
a
m
の
I
d
は一つであり、そこから全てのオブジェク
トをたどることができる。
クラス
p
r
o
g
r
a
m
の
I
d
を取得する関数
G
e
t
P
r
o
g
I
d
は
、
SDB
のデータをメモリ
第l章 ソフトウェア工学ツール開発と
S
a
p
i
d
5上にロードし、利用可能とする作業も行う。
SDB
の利用方法には
S
a
p
i
d
のバー
ジョンによりいくつかの方法がある。関数
GetProgld
の他に、モデルを直接、
利用可能とする方法(関数
openModel)
もある。
1
.
関数
g
e
t
P
r
o
g
l
d
クラス
program
のオブジェクト
I
d(
p
r
o
g
r
a
m
_
i
d
)
を求める
│program
←program_id
A
.
関数
g
e
t
P
r
o
g
l
d
クラス
program
のオブジェクト
I
d
を求める
#include <stdio.h> 制nclude<SapidjSapid.h> SpdObjld getProgldO{ char 骨target_program; SpdObjld prog
.
.
.
id;target_program ; smuGetAProgramNameO; i 削f代((prolιL-id; 叩Spd訂Ta叫r昭伊Ee州
γ
町t('
町門(
削"'吋1山 spdErrorExit("Progr問'am¥"%s¥¥"notf,お。u凹md.",target_progr阻am);, return prolL-id; } int mainO{ SpdObjld program_id; /*プログラムid *j SpdObjld file.::;d; 揖 フ ァ イjレid *jfオプジヱクト
programのIdを獲得する。 *j program_id; getProgldO; 以 下 続 くB.関数
openModel
ーモデルをロードする関数を利用
#include <stdio.h> #include <SapidjSapid.h> void openModel(SpdDBld dbld){SpdModelId ImodelId, PmodelId; ImodelId; spdUseModel(&I_model); PmodelId ; spdUseModel(&P _model); spdReadDB(lmodelId
,
dbld); }spdReadDB(PmodelId,
dbId); intmainO{ SpdO句Id program_id; SpdDsld dbld; /骨モデルをロードする。 *j dbld; s凶OpenSDBO; openModel(dbld); 戸 プ ロ グ ラ ムid *j6
S
a
p
i
d
によるソフトウェア解析技法S
a
p
i
d
では、ソフトウェアモデルとして
l
-
m
o
d
e
l
の他に、
P
-
m
o
d
e
l
等が用意
されている。また、制御構造や依存関係を解析する
s
t
a
t
e
m
e
n
t
モデル、
SDA
モ
デルなどが用意されている
(
5
章参照)。関数
s
p
d
U
s
e
M
o
d
e
l
と関数
spdReadDB
を用いて利用するモデルを決定し、関数
spdOpenSDB
でデータベースを利用
可能とする。
解析対象プログラム
1
・2
j*main.c*j Ttadd(帆 m return i + j; void dec(int坐i) { } intmainO{ inti,j, k=O,I;. ,
) ・ 1 骨 ( 1=0; while(k<100){ if(i<=J 0) k=add(i++,k); else forQ= 1;j<=10;j++){ dec(&i); } }printf(1=%d k=%d¥n",i,k); return 0; }2
.
1
例題
1
ファイル
I
d
を求める
直接求める
関連
p
r
o
g
_
f
i
l
e (
p
r
o
g
r
a
m
-
f
i
l
e
)
とプログラム
I
d
か ら フ ァ イ ル
l
d
を求める。
関連を用いてオブジヱクトを求める方法として、直接求める方法とカーソルを
利用する方法がある。直接求める関数
s
p
d
G
e
t
A
R
e
l
O
b
j
は、対象オブジエクト
が一つしかない場合や、条件により
I
d
が 一 意 に 決 ま る と き に 用 い る 。 対 象 オ
ブジエクトが複数ある場合は、カーソルを利用する関数
s
p
d
G
e
t
R
e
l
O
b
j
を用い
る
。
第
l
章 ソフトウエア工学ツール開発とS
a
p
i
d
プログラム名m
a
i
n
↓p
r
O
K
一日le
l
p
r
o
g
r
a
m
l
n
a
m
e
:
m
a
m
1 ファイル名m
a
i
n
.
c
日l
e
図
2
. I-modelによる表現 (program
司自l
e
)
① 対 応 オ ブ ジ ェ ク ト
I
d
を直接求める:
spdGe
tA
RelObj
I
OBJl
I
OBJ2
②関数プロトタイプ
←objl_id
OBJl
・OBJ2 (1
対
1)
←obj2_id
A
.
関数
spd
GetA
RelObj
オブジェクト
I
d
を求める
オブジェクト
I
d1
←s
p
d
G
e
t
A
R
e
l
∞
j
(オブジヱク卜 I
d
2
、 関 連 名(OBJ1-OBJ2)
、 条件) 型Spd
∞
J
d
Spd
∞
J
d
c
h
a
r
*
c
h
a
r
*
B
.
関数
spd
Ge
tName
ーオブジエクトの名前を求める
名 前 ←s
p
d
G
e
t
N
a
me (オブジェクト I
d
)
型c
h
a
r
会SpdO
同
I
d
③
関数利用例
プログラム
I
d
からファイル
Id
を求める
←proιid
Program-File (proι
白l
e
)
←
f
i
l
e
i
d
A
.
spd
GetAR
e
l
O
b
j
オブジェクト
Id
を求める
f
i
l
e
jd
=s
p
d
C
語tA
R
e
I
O
b
j
(pr
o
g
j
d
,'
p
r
o
g
_
f
i
l
e
'
,'
a
n
y
'
)
;
B
.
spd
GetN
ame
ーオブジエクトの名前を求める
printf~ %ファイル名は%
-
1
4
s¥内 p
d
白t
N
a
m
e
(f
i
l
e
jd )
)
;
8
S
a
p
i
d
に よ る ソ フ ト ウ ェ ア 解 析 技 法サンプルプログラム
1
-
1
ーファイル名を求める
(* ・日le_l.cプログラムを構成するファイルの名前を取得 曇/ #include <stdio.h> #include <Sapid(Sapid.h> SpdObjld getProgld(void); intmainO{ ~lX!2Þ~!4 I!~og~~m_id; SP
d
ObjldIile':'id; program_id ; getProgldO; /・プログラムid *(f
ファイルid *(fオブジヱクト自
leのldを衝尋する。 り 自leーid; spdGetARelObj(program_id,"proι日le","any"); 戸 オ ブ ジ ェ ク ト 自leの名前を出力 り printf("ファイル名は%ー14sldは%・6d¥n",spdGetName(自le_id),日le_id); return (EXIT_SUCCESS); }実行結果(一部)
│
ファイル名はmain.c ldは10485772
.
2
ク ラ ス
d
e
c
l
a
r
a
t
i
o
n
の
I
d
を 求 め る
ー カ ー ソ ル の 利 用
クラス
d
e
c
l
a
r
a
t
i
o
n
は 整 数 型 変 数 、 文 字 型 変 数 と い っ た 変 数 宣 言 、 関 数 の 定
義(宣言)などを表す。
C
言 語 の 構 文 に お け る 宣 言 に 加 え て 、 最 上 位 宣 言 、 パ
ラメータ宣言といった広い意味の宣言も表す。
各ファイルは宣言文と
#
i
n
c
l
u
d
e
といったマクロ文の集合として構成される。
関数宣言文を例とし、宣言文を構成するいくつかのクラスを説明する。関連す
る複数のオブジェクトを求めるときはカーソルを用いる。
SpdGetRelObjlnit
関数で対象オブジヱクトのビューを作成し、
spdGetRe
l
Ob
j
関 数 で カ ー ソ ル を
移動させ、順番に対象オブジェクト
I
d
を取得する。
s
p
d
G
e
t
R
e
l
O
b
j
I
n
i
t
関数は
カーソルを返す。
spdGetRelObj
関 数 の よ う に カ ー ソ ル を パ ラ メ ー タ と す る 関
数は最終的に
SAPID_NON_ID
を返す。
フ ァ イ ル 名 mam.c ↓file decl 関数定義名 mam declaration sort:DECL FUNCDEF図
3
. I
-
m
o
d
e
l
による表現
(
f
i
l
e
-
d
e
c
r
a
l
a
t
i
o
n
)
第l章
ソフトウェア工学ツール開発と
S
a
p
i
d
9①
カ ー ソ ル の 利 用 :
spdGetRelObj
I
n
i
t
関 数 で カ ー ソ ル を 初 期 化 し 、 ビ ュ ー を 作 成 す る 。
spdGetRe
l
O
b
j
関 数 で
カ ー ソ ル を 移 動 さ せ 、 対 象 オ ブ ジ ェ ク ト
Id
を順番に取得する。
I
OBJ1
I
←
o
b
j
Lid
OBJ1-0BJ2 (1
対
n)
LQ
型三」←
obj2_id
②
関 数 の プ ロ ト タ イ プ
A
.
spdGetRelObjInit
カ ー ソ ル の 初 期 化
lカーソルポインタ←
s
p
d
G
e
t
R
e
I
O
b
j
l
n
i
tCオブジエクト
I
d
、関連名、条件)
型S
p
d
C
u
r
s
o
r*
s
p
d
O
b
j
l
d
c
h
a
r
*
c
h
a
r
*
B
.
spdGetRelObj
カ ー ソ ル の 利 用
オブジエクト
I
d
2
←
s
p
d
G
e
t
R
e
I
O
b
正カーソル)
型SpdObj
l
d
S
p
d
C
u
r
s
o
r
*
lfile│
← 白l
e
_
i
d
カーソル
d
e
氾1
:
i
d
A
.
spdGetRelObjInit
カ ー ソ ル の 初 期 化
d
e
c
l
c
s
r
=sodGetRelObi I
n
i
t
(fi
l
e
i
d
.
"
f
i
l
e
d
e
c
l
"
.
"
c
-i
d
"
)
:
B
.
spdGetRelObj
ー カ ー ソ ル の 利 用
w
h
i
l
e
(
(
d
e
c
U
d
=s
p
d
白t
R
e
I
O
b
j
(
d
e
c
l
_
c
s
r
)
)
!=SAPID_NONJD) {
コードC
.
spdFreeCursor
ー カ ー ソ ル を 閉 じ る
s
p
dFr
e
e
w
r
s
o
r
(
d
e
C
I
_
c
s
r
)
;
10 Sapidによるソフトウェア解析技法
サンプルプログラム 1
・2
-宣言文
(declaration)のオブ‘ジェクト
Idを求める
/ ‘‘
decl_l.cファイルを構成する宣言文を制専(1) 骨/ #include <stdio.h> #include<SapidjSapid.h> SpdOb)I~ 事etProgld(void); iritmainO{ } SpdObjld program_id, file_id; SjxlObjlda
町
一
id; /*宣言id *j SpdCursor‘
decl_四r;/
*
宣言カーソル int I=l;l
i
m
y
A
L
笠
2
2
出
iir噌 am_id,t仰ι伽 ,
tanyu; /勢力一ソルのほ販主り d配L四r= spdGetReIObjlnit(filcid, "白le_d田1","any");fオブジエクト
Idを同書番に取得*j while ((decUd = spdGetRelO尚
(d凶 田r))'.,:,S:
¥
I
'
ID_NON_ID) { /・オブジヱクトdeclarationのIdを出力ワ printf【"%d番目の宣言は.%d¥n",
i++,
decUd); spd丹 田Cu田 町(decl田:r);j骨カーソ)!-の破棄り retum(E氾T_SUCCESS);実行結果(一部)
l番目の宣言 IDは 2097157 2番目の宣言 IDは 2097154 3番目の宣言 IDは 2097153E
クラス
declarator(宣言子)と属性値の取得
クラス
declarationはクラス
declarator(宣言子)と関連
decl_decl持つ。ま
た
declaratorはクラス
identifierと 関 連
decl identを、クラス
typeと関連
decCtype
を持つ。
↓decl_opt optional_decl Sort:OPT FUNCDEF ↓func_body パ ラ メ タ argc 図4. I-moclelによる表現 type sort:DECLARATION type:INT パ ラ メ タ argv第 1章
ソフトウエア工学ツール開発と
S
a
p
i
d
113
.
1
関 数 宣 言 子 の
Id
を求める
宣 言 文 の 中 で 関 数 宣 言 文 を 選 ぶ 。 関 数 宣 言 は 、 ク ラ ス
declaration
、 属 性 値
s
o
r
t
が
DECL_FUNCDEF
・である。関数宣言文のオブジェクト
Id
を、ファイル
Id
か ら 関 連
f
i
l
e
_
d
e
c
l
に よ り 順 番 に 求 め る 。 属 性 値
sort
の値を求めるために、
関数
spdGe
tA
t
t
r
V
a
l
I
ntO
を用いる。
マクロ定義
種 類DECL VARIABLE
v
a
r
i
a
b
l
e
変数
DECL MEMBER
member
メンバ
DECL FUNCDEF
f
u
n
c
d
e
f
関数
DECL PROTOTYPE
p
r
o
t
o
匂やEフ。ロトタイフ。DECL TAG
s
t
r
u
c
t
,
u
n
i
o
n
,
enum t
a
g
構造体等のタグ
DECL TYPE
匂r
p
e
型DECL ENUMERATOR
e
n
u
m
e
r
a
t
o
r
列挙子DECL PARMτYFE
p
o
i
n
t
e
r
,
a
r
r
a
y
ポインタ一等
[クラス
d
e
c
l
a
r
a
t
o
r
の属性
s
o
r
t
のマクロ定義]
Prog_file
、
f
i
l
e decl
と い っ た 関 連 は 、 プ ロ グ ラ ム の 構 成 と 対 応 し て お り 、
「構成関連J と呼ぶ。一方、クラス
i
d
e
n
t
i
f
i
e
r
のオブジェクトなどは、プログラ
ム 中 に 複 数 回 出 現 す る 可 能 性 が あ る 。 あ る 式 中 に 出 現 す る 変 数
k
は 、 そ の 変 数
の 宣 言 文 と 参 照 関 係 に あ り 、 こ れ を 「 参 照 関 連 」 と 呼 ぶ 。 こ の と き 変 数
k (
identifier
オ ブ ジ ェ ク ト ) は 式 と 参 照 関 連
ident ref
を 持 ち 、 変 数 宣 言 子
(
d
e
c
l
a
r
a
t
o
r
)
と構成関連
decl_ident
を持つ。
① 属性値を求める
←
objLid
属 性 値 : 値
② 関 数 の プ ロ ト タ イ プ
一 般 的 な 属 性 値 取 得 関 数
spdGe
tA
t
t
r
V
a
l
I
n
t
属 性 値 ←
spdGetAttrVallnt
(オブジェクト
I
d
. 種類)
型i
n
t
SpdOb
j
l
d
char*
12
S
a
p
i
d
によるソフトウェア解析技法
③
属性値を求める
←
d
e
c
l
i
d
種類
(SORT)
A
.
spdGe
tA
t
t
r
V
a
l
I
n
t
の関数利用例
i
f
(
s
凶
GetAt
t
r
V
a
l
l
n
t
(
d
e
c
l
一 氏c
.
o
同
e
c
t
ld
,
"
s
o
r
t
つ
=
=
DECLJUNCDEF) {
I
サンプルプログラム
1
・3
関数宣言のオブジェクト Idを求める
/ ・ * funcdecJ_l.c関 数 宣 言 文 のIdを耳iu号 *j #incJude <stdio.h> #incJude <SapidjSapid.h> SpdObjld getProgld(void); intmainO{ } SpdObjld program_id.日le_id,decUd ; SpdC町 田r-*decl_町 ; int i= 1; program_id = getProgldO; file':"id = spdGetAReIObj(program_id,''prog日le","any") ; decl二
回
r=' spdGetReIOoji"nit(file泊,"tlI,に:aecJ","any");whil~J(de.c!_id = ~p<!ge~el<?bjÇ~.ecJ-,田川=SAPID_NON_ID) { if(spdGetAttrValInt(decUd,"sort") == DECL]UNCDJ;:F)
prinぜ'C"関量撞言%dld=%d%d¥n",i++,decUd); spdFreeCu目 前(decJ_,四r); return (EXIT_SUCCESS); }
実 行 結 果
関 数 宣 言lId=2097157
関 数 宣 言2Id= 20971 55
関 数 宣 言3Id=2097153
3
.
2
定義関数の名前を求める
関 数 の 名 前 は ク ラ ス
i
d
e
n
t
i
f
i
e
r
(識別子)により得る。クラス
i
d
e
n
t
i
f
i
e
r
は
、
プ ロ グ ラ ム 中 に 出 現 す る 関 数 や 変 数 を 表 し 、 属 性
name
で名前を得る。
1
-model
で は 、 ク ラ ス
i
d
e
n
t
i
f
i
e
r
(識別子)、
o
p
e
r
a
t
o
r
(演算子)、
c
o
n
s
t
a
n
t
(
定
数
)
、
t
y
p
e
(型名)の各オブジェクトをプログラムの最小単位としてあっかう。
第 l章 ソフトウェア工学ツール開発とSapid 13 constant
はプログラム中に出現する定数を表す。
C言語の定数は整数型、小数
型、文字型、文字列型の
4種類である。
identifierオ ブ ジ ェ ク ト は プ ロ グ ラ ム 中 で 複 数 回 出 現 す る の で 、 参 照 関 連
ident_ref (identifer-expression)によって出現場所(オフセット)を決定す
る。同一の有効範囲にあり、同じ名前を持つ
identifierは同一のオブジェクト
である。有効範囲を超えたものは別のものとみなす。
ID VARlAB
LE variable ID FUNCTION function ID MEMBER member ID ENUMERATOR enumerator ID τYPENAME型名
ID TAG 構造体tag [ identifierの属性sortのマクロ定義]クラス
declaratorがクラス
identifierと 構 成 関 連
decl identを持つので、
declarator
のオブジェクト
Idから、
identifierとのオブジェク卜
Idを求める。
サンプルプログラム
1
・4 一定義関数の名前を求める
/ 骨 骨 decl_2.cファイルを構成する関数宣言文を取得 骨/ #include <stdio.h> #include <SapidfSapid.h> void getProgld(void); Ttmam(mt岬 , 伽 匂 刷 ] ) SpdObjld program_id,日Cid,decUd, decr_id, idenCid; SpdCursorサed四r' int i=j;E
時 ram_id=ge酌Hd(); le':'id = spdGetAReIObj(program_id,"pro~file" ,"any"); decl_csr =-spdGetReIOojInit[file_id, "fi1e_aecl", "any"); while ((decUd = spdGetReIObj(decl_,田r))!=SAPID_NON_ID) if(spdGetAttrYalInt(decl_id,"sort") == DECL_FUNCDEF){ decr_id = spdGetAReIObj(decUd,"decl_decl","p-id"); idenUd= spdGe凶RelOιJ(deC
r
_id,"decT_ident","pーば');prin“("関数宣言%dId=%d%d%s¥n",i++,decUd,spdGetName(idenCid));
spdFreeCursor(decl_csr); retum (EXIT_SUCCESS); }
1
4
S
a
p
i
d
によるソフトウェア解析技法関数
getFuncName
プログラム名を求める
VQ両瓦玩Fu瓦 扇 町l
e
(
S
p
;
i
O
b
j
l
dd
e
c
r
_
i
d
)
{
S
o
d
O
b
iId
i
d
e
n
t
i
d
:
c
h
a
r
*f
u
n
c
n
a
m
e
目i
d
e
n
C
i
d
~s
p
d
GetARe
l
O
b
j
(
d
e
c
r
_
i
d
,"
d
e
c
U
d
e
n
t
"
,"
a
n
y
"
)
;
f
u
n
c
_
n
a
m
e
~-
s
p
d
Get
N
a
m
e
n
d
e
n
C
i
d
)
;
}
printf(明JNC_N馴E~%-3色", funé~name);実行結果
関数宣言
lId=2097157main
関数宣言
2Id= 20971 55 i
n
c
関数宣言
3Id= 20971 53 dec
W
ク ラ ス
optionalde c
l
(オプショナル宣言)
関 数 宣 言 子 や 、 代 入 文 を 持 つ 宣 言 子 な ど の 付 加 部 分 を ク ラ ス
optionaldecl
(オプショナル宣言)をとして扱う。
declarator
中の型名および識別子以外の
部分を表わす。関数プロトタイフ宣言の引数部、関数定義の引数と本体、変数
の初期化式、代入文を持つ変数宣言、構造体、共用体、列挙体宣言などの付加
部分である。
char message[]="Hello world!
¥n
"
;
マクロ定義
OPT PROT0
1YP
E
OPT FUNCDEF
OPT I
N
I
τ1AL
IZER
OPT
STRUCTOPT FUNCPTR
↑オプショナル宣言部
[オプショナル宣言]
種類p
r
o
t
o
t
y
p
e
関数プロトタイプ
f
u
n
c
d
e
f
関数
i
n
i
t
i
a
l
i
z
e
r
初期樫木s
t
r
u
c
t
,
u
n
i
o
n
,
enum t
a
g
構造体等のタグ
f
u
n
c
p
t
r
関数ポインタ
[クラスd
e
c
l
a
r
a
t
i
o
n
の属性s
o
r
t
J
関数のパラメータ部や定義本体をあつかうために、関数の
optionaldecl
(
オ
プショナル宣言)のオブジエクト
Id
を求める。
declaration
と
optionaldecl
は
直接関連を持たない。このような場合は、オブジェクトの出現(オカレンス)
を利用する。オカレンス
Occurence
は構造体であり、識別番号や、対応する関
第1章
ソフトウェア工学ツール開発と
S
a
p
i
d
15連
I
d
、オブジエク卜
I
d
といった情報を持つ。オブジェクトの出現を求めるに
は関数
spdGe
t
IncludedOcc
群を用いる。
オブジェクトの識別番号
出現を含むファイルオブジェクトの識別番号
長さ(by
t
e
単位)関連の識別番号
[
O
c
c
u
r
e
n
c
e
の基本的な属性]①
オカレンス・カーソルを扱う:
spdGe
t
IncludedOcc
オカレンスを扱うためにカーソルを利用する。
I
n
i
t
関数でカーソルを初期化
し
、
spdGe
t
IncludedOcc
関数でカーソルを移動させ、対象オブジェクトのオカ
レンス
o
c
c
を順番に取得する。
①
笠~ ←o
句l
_
i
d
上位オブジェクトの
I
d
)
U
←o
b
j
2
ーO凹OBJ2
↑
o
b
j
2
_
o
c
c
.
o
b
j
c
t
I
d
② 関数のプロトタイプ
A
.
s
p
d
G
e
t
I
n
c
l
u
d
e
d
O
c
c
I
n
i
t
ーオカレンスカーソルの初期化
カーソル
I
d
←spdGe
t
l
r
d
民 的c
c
l
n
t
(
上位オブジェクトの
I
d
、対象クラス名、
f
i
l
e
_
i
d
)
型 め d Ct
r
s
o
r
spdObjldc
同 伴 spdObjdB
.
spd
G
e
t
I
n
c
l
u
d
e
d
O
c
c
ーオブ‘ジェクト出現を求める
│
オ カ … 吋 枇 印 刷 カ ー ソ ル )
型匂dObjd SpdC山or16
S
a
p
i
d
によるソフトウェア解析技法③利用例
d
e
c
l
i
d
← 自l
e i
d
U
l
カ 引 レ
│opCidl
o
p
t
_
i
d
2
↑opCo
∞
.
o
b
j
c
t
I
d
Aspd
G
e
t
I
n
c
l
u
d
e
d
O
c
c
I
n
i
t
ーオカレンスカーソルの初期化
│opt_csr
=
s
p
d
G
e
t
l
n
c
l
l
府d
O
c
c
l
n
附
l
e
j
d
,
"
o
p
t
i
o
制d
e
c
l
"
,
f
i
l
e
_
i
d
)
;
B
.
s
p
d
G
e
t
I
n
c
l
u
d
e
d
O
c
c
ーオブ
Pジェクトの出現(オカレンス)を求める
│opt_occ
=
s
p
d
G
e
t
l
n
c
l
u
d
e
d
O
c
c
(
o
p
t
_
c
s
r
)
Cspd
G
e
t
I
n
c
l
u
d
e
d
O
c
c
の使用例
関連
I
d
で調査
w
h
i
l
e
(
(
O
p
t
_
o
c
c
=
s
p
d
G
e
t
l
n
c
l
u
d
e
d
O
c
c
(
o
p
t
_
c
s
r
)
)
.
r
e
l
a
t
i
o
n
l
d
!
=
SAPID
_NONJD)
{
コード
}
D. オカレンスからオブジェクト
I
d
を求める
│obj2_ld
=
o
p
t
_
o
c
c
.
o
b
j
c
t
l
d
カーソルを利用して、対象となるオカレンス
opt_occ
を順番に取得する。オ
カ ン レ ン ス
opt_occ
は 構 造 体
SpdOcc
型 の 変 数 で あ る 。 カ ー ソ ル の 終 点
(SAPID_NON_ID)
を求めるために、オカンレンス
opt_occ
の持つ関連
I
d
にア
クセスする。同一オブジエクト
I
d
に対して複数の出現が存在するので、乙の
条件式にオブジェクト
I
d
は用いない。関連
I
d
は構造体変数
opt_occ
のメンバ
変数
r
e
l
a
t
i
o
n
l
d
に格納されている。オブジェクト
I
d
を求めるために、オカンレ
ンス
opCocc
のメンバ変数
o
b
j
e
c
t
l
d
にアクセスする。
サンプルプログラムト
5
オプショナル宣言のオブジェクト
I
d
を求める
/ ・ * optl.cオプショナル宣言のオブジェクトIdを求める。 骨/ #include <stdio.h> #include <Sapid/S泊pid.h> int main(int argc, char *argv(])SpdCursor *decl_四r骨o,pt_csr; SpdOcc 0恒t_occ; SpdObjld file_id, program_id, decUd; 第
1
章 ソフトウェア工学ツール開発とS
a
p
i
d
17 Emgmm-1d=EetP噌
dO; le,
.
.
i
d = spdqe!AA.~qi?J~I?!o!l~~\,,_i~,tl1~og,自let,tany U; decl_csr = s凶GetARelO切Init(filcid,・f'ile_decl",地nyt); while((decUd = spdGetRelObj(decLcsr)) != SAPID_NON_ID) { if(spdGetAttrValInt(decl_id,"sort") == DECL_FUNCDEF) {fオカレンス・カーソルの書提V
opt田r= spdGetIncludedOccInit(decUd, "optionaldecl", file_id);fオカレンスを順番に耐ヂ/
while ((opCocc = spdGetIncludedOcc(opCcsr)).relationld !=SAPID_NON_ID) { prinぜ("%aのオブジェクトIdは%-8d ¥n",i++,opt_occ.objectId); } } spdFreeCursor(opCcsr); } spdFreeCursor( decl田r); return (EXIT_SUCCESS);実行結果
O
p
t
_
I
d
:
1=5242882
Opt_Id:2=5242881
Opt_Id:3=5242880
第2章
ドキュメントの作成
19第
2
章
ドキュメントの作成手法
I
関 数 ド キ ュ メ ン ト の 構 成
プログラムのドキュメントは関数定義やファイル、変数に関する情報なと、か
らなる。関数のドキュメントは、定義関数名、型、引数、関数呼び出しといっ
た情報を持つ。本章では、定義関数の名前と型の取得、パラメータ情報取得を
I
I
I 関数定義に関する情報の取得Jで、プログラム中における変数や定数の出
現の取得を
1
m
変数、定数、演算子に関する情報の取得」で、関数の呼び出
し関係の取得を
IN関数呼び出し情報を求める」で扱う。
1
関数定義の一覧表
2
関数の名前と型、出現の絶対位置
3
パラメータの数、名前と型
4
関数本体中に出現する変数の型、名前、出現の相対位置
5
関数本体中に出現する定数の型、値、出現の相対位置
6
関数本体中に出現する演算子の種類と出現の相対位置
7
関数呼び出し情報
[関数ドキュメントの構成]
E
関 数 定 義 に 関 す る 情 報 の 取 得
関数宣言のクラスは
d
e
c
l
a
r
a
t
i
o
n
(宣言)であり、宣言文の内容を示すクラ
ス
d
e
c
l
a
r
a
t
o
r
(
宣言子)と関連
d
e
c
l d
e
c
l
を持つ。関数の宣言クラス
(
d
e
c
l
a
r
a
t
i
o
n
、
d
e
c
l
a
r
a
t
o
r
)
の
s
o
r
t
は
DECL FUNCDEF
である。
関数名と関数の型はそれぞれクラス
i
d
e
n
t
i
f
i
e
r
、
t
y
p
e
である。
i
d
e
n
t
i
f
i
e
r
オブ
ジェクトは
d
e
c
l
a
r
a
t
o
r
オブジエクトと関連
d
e
c
l
_
i
d
e
n
t
を持つ。
2
0
S
a
p
i
d
によるソフトウェア解析技法 ↓d
e
c
l
_
o
p
t
o
p
t
i
o
n
a
l
_
d
e
c
l
s
o
r
t
:
O
P
T
FUNCDEF
↓f
u
n
c
_
b
o
d
y
2
.
1
名前、型を求める
パラメータ argc 図 1t
y
p
e
s
o
r
t
:
D
E
C
L
A
R
A
T
I
O
N
t
y
p
e
・I
N
T
パラメータ argv型宣言には、
i
n
t、charといったデータ型宣言の他に、 const、v
o
l
a
t
i
l
eとい
った修飾子、
longなどのサイズ指定子、
signed、unsignedといった s
i
g
n指定
子の宣言がある。ポインタ型、配列、構造体、共用体、
enum型といった複雑
な型やユーザ定義の型もある。クラス
type
は す べ て の 型 の 宣 言 に 関 す る 情 報
を保持している。ここでは整数型、文字型といった基本的な型とポインタ型、
配列型のみを扱うプログラムを考える。
関数
g
e
t
Typ
eN
ameBasicは、クラス t
y
p
eの属性 s
o
r
tがTYPE_DECLARA
TION
のとき、型の名前を標準出力に出力する。関数getTypeNameは、クラス型 t
y
p
e
の属性s
o
討を調べ、
TYPE_POINTER(ポインタ型)の場合はその情報を出力する。
関連
t
y
p
e
_
s
tで続く匂r
p
eオブジエクトを求め、関数 getTypeNameを再帰的に呼
び出す。
TYPE_ARRAY(配列型)のときも同様である。 TYPE_DECLARATIONの
ときは関数Get'可rpeNameBasicを呼び出す。
関数
GetTypeNameBasic 一型を求める関数(基本型)
c
h
a
r
• g
e
t
Type
N
a
m
e
B
a
s
i
c
(
S
p
d
O
句I
d
t
Y
P
C
i
d)
{
1的咳;拠出臨む
V
;
E
J
J
=
ァ,3
3
z
D
配 山 町N) 回s
e
1YPE
INT:r
e
t
u
r
n
"
1
NT":
b
r
e
a
k
c
a
s
e
1YPE
_
V
O
I
D
:
r
e
t
u
r
n
"
V
O
I
D
"
;
b
r
e
a
k
;
c
a
s
e
1YPE
_
C
H
A
R
:
r
e
t
u
r
n
"
C
H
A
R
"
;
b
r
e
a
k
;
c
a
s
e
τ
Y
P
E
_
D
O
U
B
L
E
:
r
e
t
u
r
n
"
D
O
U
B
L
E
"
;
b
r
e
a
k
;
} case 1YP瓦 FL心AT: return "FLOAT";break; 国seTYPE DOTS return "...";break; 国seTYPE UNKNOWN: return "UNKNOWN";b同ak; default: r由Irn"NULL"; 第2章 ドキュメントの作成 21
関数
getTypeName一型を求める関数(配列,ポインタの場合)
void〓
ηpeName(SpdObjldtype_id){ SpdObjld type_id 1; if ((type_id 1 =spdGetARelObj(type_id,
"type_st"、
,
ny"))!=SAPID_NON_ID) switch(spd阻etAttrValInt(typeーid,"s旧rt")){ } 回 目TYPE_POINTER: printf("POINTER OF "); geηpeName(type_id 1);break; 回se1YPE ARRAY printf("ARRAY OF "); getTypeName(type_id ]);br回k default: prmぜ("%s,"getTypeNameBasic(type_id 1l); break2
.
2
関数定義文の出現位置を求める
関 連
Id
属性
offsetの取得
関数定義文の出現位置と範閣を求めるプログラムを作成する。関数宣言のク
ラス
declarationの開始位置と終了位置を求めるため、
offsetとオブジェクトの
長さ(クラスの属性)を利用する。
オ ブ ジ ェ ク ト の 出 現 位 置 は 関 連 の 属 性
offsetに格納されている。
offsetには
各ファイルの先頭からのバイト数であらわされる絶対位置と、各関数宣言の先
頭からの相対位置がある。
①対応オブジエクトとの関連を求める:
spdGetARel ← objl_id ← obj2_id ②関数プロトタイプ
AspdGetARel一関連の取得
関連
← spdGetARel(オブジェクト
Id1、関連名、条件)
型
SpdRel SpdObjld char* char*22 Sapidによるソフトウェア解析技法
BspdGetOffset ー相対オフセットの取得
オ フ セ ッ ト ← spdGe
tO
ffset(関連Id) 関連Id← 関連 .relationld型
int SpdRelld 構 造 体 SpdRelのメンバ
relationld C. spdGetAbsoluteOffset ー絶対オフセットの取得 関数プロトタイプ 絶対オフセット ←SpdGetAbsoluteOffset (関連Id、 オブジェクト Id) int SpdRelld SpdObjld 関数利用例 Absolute offset spdGetAbsoluteOffset(constJe.rlelationld, filejd) ③ 関数利用例 ←f
i
l
e
id ←dec
I
rel
.
relationld AspdGetARel 一関連の取得 decl_rel= spdGetARel(tilejd, 'file_decl',"any開); BspdGetO
ffset オフセットの取得printf(' OFFSET:%-6d¥n' ,spdGe
tO
ffset( decl_re.rlela tionld));オフセット prog_fileのオフセット位置(絶対 0)
.
.
1
*
main.c申/↓
file declのオフセット位置(絶対offset) void mainO{↑
↑
declーidentのオフセット位置(相対offset1、絶対off矧 +offsetl)decl_typeのオフセット位置 (相対offset2、 絶 対offse
t+
offset2)オブジェク卜の長さ
1
*
main.c*
1
↓
悦
由
clのオフセット位置(オブジェクトの開始位置 絶 対offset)void mainO{
解析対象プログラム
2
・1
/*main.c*/ Ttadd(刷 ,intj) return1 + J; void dec(int骨i) { ( ・i); !Li一山川tれE町n出a剖叩凶山I凶IE inti,j, k=O,I;,
1=0; while (k< lOO){ if(i<=lO) k=add(i++,k); else forG= l;j<=lO;j++){ dec(&i); } printf("i=%d k=%d¥n",i,k); return 0; 第2章 ドキュメントの作成 23サンプルプログラム
2-1
関数の名前、型、出現位置を求める
山ncl三五三証函瓦h>u #include <Sapid/Sapid.h> SpdObjld getProgld (void); ?tmain(int岬 , 伽 勢argv[]) SpdRel idencrel, decl_rel; SpdCursor ~decl 田町SpdObjld file_id, proιid, decUd, decr_id, type_id; I'ro!Lid= getProgIdO;
d
z
t
i
s
:
:
慣斜路包
l
?
縦
p
t
j
:
ム
:
:
?
?
;
i
l
i
,); while ((decUd = spdGetReIObj(decl_csr)) != SAPID_NON_ID){if (spdGetAttrValInt(decUd, "sort") =.= DECL]UNCDEF) { decr_id = spdGetARclO
巴
d(decl':"id,"decl_declγany"); / /関連Idを求める decl_rel = spdGetARel(decUd, "file_decl","any"); / /関数の名前を求める getFuncName(decr_id); / /関数の型空ヨめるtype_id = spdCetAReIObj(idenCre.olbjectId, "ident_句'Peγany");
デ
tyNme(type-尚 /1 りオフセット値を求めるprintf(" OFFSET:%-(id¥n",spdGetO他et(decl_re.rlelationld));
spdFreeCursor( decl_ csr); return (EXIT_SUCCESS);