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

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

N/A
N/A
Protected

Academic year: 2021

シェア "Sapidによるソフトウェア解析技法"

Copied!
155
0
0

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

全文

(1)

滋賀大学経済学部研究叢書第

3

8

Sapid

によるソフトウェア解析技法

斉 藤 邦 彦 著

(2)

滋賀大学経済学部研究叢書第

3

8

Sapid

によるソフトウェア解析技法

斉 藤 邦 彦 著

(3)

まえがき

コンビュータが普及し、誰もがインターネットを利用できるようになった背

景には、ハードウェア技術、通信技術、そしてソフトウェア技術の発展がある。

しかし半導体や電子デバイス、ネットワーク機器の急速な発展に比べ、ソフト

ウェアの進歩はあまり目立つものではなかった。

ソフトウェア技術には

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

で「実効的」な技術をめざしている。技術開発サ

(4)

イクルの速さと、その普及の遅さのギャップを埋め、さまざまな方法論やツー

ルを実際の開発現場で応用することを可能とし、関連する支援環境を実現する。

ソフトウェアの再利用をはじめとして、構成管理、

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)

(5)

最 後 に 、 本 書 と 関 連 す る 研 究 に 関 し て 、 多 大 な ご 指 導 、 ご 助 言 く だ さ っ た

方々に感謝を申し上げます。名古屋大学大学院工学研究科でご指導を

I

貞いた指

導教官の名古屋大学大学院工学研究科情報工学専攻教授稲垣康善先生、名古屋

大学名誉教授福村晃夫先生、また研究のご指導を頂いた名古屋大学大学院工学

研究科情報工学専攻坂部俊樹先生、東北大学大学院工学研究科電気・通信工学

専攻阿曽宏具先生に感謝を申し上げます。

本書の作成と関連する研究の基礎となった

Sapid

プロジェクトのリーダーで

ある名古屋大学大学院工学研究科阿草清滋先生、フロジェクトの推進者である

愛知県立大学情報科学部山本晋一郎先生、フロジェクトの中心メンバーである

和歌山大学システム情報学センタ一吉田敦先生、システム工学部福安直樹先生、

南山大学数理情報学部蜂巣吉成先生、愛知県立大学情報科学部粕谷英人先生に

感謝を申し上げます。

また、経営情報システムに関連する研究に関してご助言を頂いた名城大学都

市情報学部尾碕員先生、流通経済大学経営情報学部蜂谷博先生、関西大学総合

情報学部山内昭先生に感謝を申し上げます。最後に、本書の出版の機会をあた

えてくださった、滋賀大学経済学部の先生方に感謝を申し上げます。

2003

3

斉藤邦彦

(6)

目 次

まえがき

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

(7)

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

(8)

第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白町:,泊9

(9)

2

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

言語の構文解析オブジェク

(10)

第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

の内部構造

[主なクラス1

1

福喜一

名前 長さ(byte単位) 種 類 一方のオブジェクトobjlの識別番号 他方のオブジェクトobj2の識別番号 ファイルの先頭からの位置 [関連の属性]

ソフトウェアデータベース

SDB

の内部構造を、サンプルのプログラムを用

いて説明する。ターゲットとするプログラムの

I-model

による表現の一部と、

対応する

SDB

データの内容を例示する。

解析対象プログラム

1-1 /‘ファイル名 main.cプログラム名 main */

?

ntargc, 山 内rgv[]) char message[]="Hello world!¥n"; printf("%s",me田age);

(11)

4

S

a

p

i

d

によるソフトウェア解析技法 プログラム名main ↓proιfile

I

nam

~叩n

川巴田町lamI l ファイル名 mam.c 日le name: maln │ ↓ 日le_decl │ 関数定義名 Id回clarati叩 '1sort:DE氾L FUNCDEF 図2. I-modelによる表現 オブジェクトId

I

属性: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] オブジェクトId1

I

オブジェク卜Id2

I

属性・オフセット

11048576 113

I

1048577

I

13 [SDB例4 関連名proι日lel オブジェクトId1

I

オブジェクトId2

I

属性:オフセット 1048576 1 2097155 1 13 [SDB例5 関連名file_declJ

E

クラス

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

のデータをメモリ

(12)

第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 pro

g

.

.

.

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 *j

fオプジヱクト

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 *j

(13)

6

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

を用い

(14)

l

章 ソフトウエア工学ツール開発と

S

a

p

i

d

プログラム名

m

a

i

n

p

r

O

K

一日l

e

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

語t

A

R

e

I

O

b

j

(p

r

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 )

)

;

(15)

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; S

P

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は1048577

2

.

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

)

(16)

第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

(f

i

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

dF

r

e

e

w

r

s

o

r

(

d

e

C

I

_

c

s

r

)

;

(17)

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; SjxlObjld

a

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は 2097153

E

クラス

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

(18)

第 1章

ソフトウエア工学ツール開発と

S

a

p

i

d

11

3

.

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*

(19)

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

(型名)の各オブジェクトをプログラムの最小単位としてあっかう。

(20)

第 l章 ソフトウェア工学ツール開発とSapid 13 constant

はプログラム中に出現する定数を表す。

C言語の定数は整数型、小数

型、文字型、文字列型の

4種類である。

identifier

オ ブ ジ ェ ク ト は プ ロ グ ラ ム 中 で 複 数 回 出 現 す る の で 、 参 照 関 連

ident_ref (identifer-expression)

によって出現場所(オフセット)を決定す

る。同一の有効範囲にあり、同じ名前を持つ

identifier

は同一のオブジェクト

である。有効範囲を超えたものは別のものとみなす。

ID V

ARlAB

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(de

C

r

_id,"decT_ident","pーば');

prin“("関数宣言%dId=%d%d%s¥n",i++,decUd,spdGetName(idenCid));

spdFreeCursor(decl_csr); retum (EXIT_SUCCESS); }

(21)

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

iI

d

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

GetAR

e

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

Ge

t

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

STRUCT

OPT 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

は構造体であり、識別番号や、対応する関

(22)

第1章

ソフトウェア工学ツール開発と

S

a

p

i

d

15

I

d

、オブジエク卜

I

d

といった情報を持つ。オブジェクトの出現を求めるに

は関数

spdGe

t

IncludedOcc

群を用いる。

オブジェクトの識別番号

出現を含むファイルオブジェクトの識別番号

長さ(b

y

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

←spdG

e

t

l

r

d

民 的

c

c

l

n

t

(

上位オブジェクトの

I

d

、対象クラス名、

f

i

l

e

_

i

d

)

型 め d C

t

r

s

o

r

spdObjld

c

同 伴 spdObjd

B

.

spd

G

e

t

I

n

c

l

u

d

e

d

O

c

c

ーオブ‘ジェクト出現を求める

オ カ … 吋 枇 印 刷 カ ー ソ ル )

型匂dObjd SpdC山or

(23)

16

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(])

(24)

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

(25)

第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

を持つ。

(26)

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 図 1

t

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

Typ

e

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

1YP

E

INT:

r

e

t

u

r

n

"

1

NT"

:

b

r

e

a

k

c

a

s

e

1YP

E

_

V

O

I

D

:

r

e

t

u

r

n

"

V

O

I

D

"

;

b

r

e

a

k

;

c

a

s

e

1YP

E

_

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

;

(27)

} 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); break

2

.

2

関数定義文の出現位置を求める

関 連

Id

属性

offset

の取得

関数定義文の出現位置と範閣を求めるプログラムを作成する。関数宣言のク

ラス

declaration

の開始位置と終了位置を求めるため、

offset

とオブジェクトの

長さ(クラスの属性)を利用する。

オ ブ ジ ェ ク ト の 出 現 位 置 は 関 連 の 属 性

offset

に格納されている。

offset

には

各ファイルの先頭からのバイト数であらわされる絶対位置と、各関数宣言の先

頭からの相対位置がある。

対応オブジエクトとの関連を求める:

spdGetARel ← objl_id ← obj2_id ②

関数プロトタイプ

AspdGetARel

一関連の取得

関連

← spdGetARel

(オブジェクト

Id1

、関連名、条件)

SpdRel SpdObjld char* char*

(28)

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 ←de

c

I

re

l

.

relationld AspdGetARel 一関連の取得 decl_rel= spdGetARel(tilejd, 'file_decl',"any開); BspdGe

tO

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{

(29)

解析対象プログラム

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);

図 2 . ワークフローモデル

参照

関連したドキュメント

方法 理論的妥当性および先行研究の結果に基づいて,日常生活動作を構成する7動作領域より

Revit Architecture は、BIM(ビルディング・インフォメーション・モデル)作成のトップツールになってお

一次製品に関連する第1節において、39.01 項から 39.11 項までの物品は化学合成によって得 られ、また 39.12 項又は

解析モデル平面図 【参考】 修正モデル.. 解析モデル断面図(その2)

2 次元 FEM 解析モデルを添図 2-1 に示す。なお,2 次元 FEM 解析モデルには,地震 観測時点の建屋の質量状態を反映させる。.

評価する具体的な事故シーケンスは,事故後長期において炉心が露出す

, “ An Investigation of the Collapse and Surface Rewet in Film Boiling in Forced Vertical Flow ” , Transaction of ASME, Journal of Heat Transfer, May

一方,SAFERコードは,単相蒸気熱伝達の Dittus-Boelter 式及び噴霧流熱 伝達の