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

一実行順でオブジエクトを求める

ドキュメント内 Sapidによるソフトウェア解析技法 (ページ 88-96)

NEXTSTMT CONTROL  NEXTSTMT IρOPB A : CK

サンプルプログラムら 4 一実行順でオブジエクトを求める

#include <stdio.h> 

#include <SapidjSapid.h> 

#include <SapidjStmtMode.lh> 

#inc¥ude <SapidjSDArnode.lh> 

void getNextStmt(SpdObjld 

SpdObjld);  void getStmtSort (SpdRelld); 

?tmm(imgc, 伽 ーargv[]) SpdObjldArray sda̲array;  SpdObjld  firsUd; 

g d I d  dbId;  dbld = spdOpenSDBO; 

openModel(dbld); 

sda̲8π'8y=spdGetObjldArray("sdafunc" NULLNULL); 

for (i = 0; i < sda̲aay.size;i++){ 

1 2 4 G 誠治 3 d B g E L 討 I Z S 叫

's

と 3 3 2 ; 畑 山

JSLid);

getNextStmt(自問.Ud); } 

spdFreeObjldArray(sda̲array);  spdC)oseSDB(dbld);  return (EXIT̲SUCCESS); 

関数

getNextStmt

一次の文を求める

void getNextStrnt(SpdOIdtop̲id

SpdObjld next̲id){ 

SpdObjld lP̲id; SpdCursor  'strnt.一 回r'

strnCcsr=spdGetReIObjlnit(日間Cid"next̲strntγp‑id"); while((tmp̲id = spdtRelO

。 旬

trnt一間))!= SAPID̲NON̲ID){ 

if(ldd>rsUd){

getNtStmt(trnp̲id);prin("¥n"); printf("¥tfrorn =%d "filUd);

getNex諸 国tSort(spdGetARelId(rsCid,回p̲idNULL)"first̲id); }pnnd("nextz%d'Imp id); 

else{ 

printf(n¥torn= %d 

, "

firsCid); 

getNextSuhtSod(p.dGe凶ReTld(rsCidtrnp̲idNULL)Ud);

prin"("next= %d 

, "

trnp.id); spdFreeCuor(strntr);

5 制 御 構 造 と 依 存 解 析 SDAモデル 85 

関数 g e S t m t S o r t

一次の文の種類を求める

v'OidgetN StmtSo凶(SpdRelIdstate̲RelId, SpdObjldrsUd){

int  attr̲ val;  SpdObjld  expUd; 

attr̲val = spdGetAttrVaIlnt(state̲RelId"s'O'); tch(a val){

seNEXTSTMT NORMAL: 

{printf("NORMAL Statement  "); break;} 

回 目NEXTSTMT1ρOPBACK 

{printf("LOOPBACK Statement "); break;} 

回 目NEXTSTMTCONTROL: 

{prin("CONTROLStatement ");break;} 

曲 目NEXTSTMT̲DECL

{printf("DECLARATION Statement ");g'Ot'O END;} 

seNEXTSTMT END: 

{prin("ENDStatement");bak;} default 

printf("Other Statement  ");  getStmt(first̲id);  END: 

関数 g e t S t m t

次の文を求める

v'OidgetSt(SpdObjldrsUd){

SpdO切Id prーid

decl̲id

expr 1̲id; 

実行結果(部分)

FUNCTION(SDA): 56623138rst=2097155 

台。m= 566231161βOPBACK Statement c'Ond = 7340047  c'Ontr'Ol̲b'Ody = 56623117 next = 56623118  fr'Om = 56623119next = 56623116 

fr'Om = 56623121 next = 56623119 

''Om= 566231191βOPBACKStatement iter = 7340064 cond = 7340062  f'Or = 7340059c'Ontr'Ol̲b'Ody = 56623120next = 56623121  fr'Om = 56623123next = 56623i22 

仕'Om =56623123next= 2097156 

from = 56623122NORMAL Statement  stmt = 7340069next = 56623123  from = 56623122next = 56623119 

from = 56623122next = 56623114 

仕'Om= 56623119NORMAL Statement  iter = 7340064 c'Ond = 7340062  f'Or = 7340059C'OO仕'Ol̲booy= 56623120 next = 56623122  fr'Om = 56623116NORMAL Statement  c'Ond = 7340047 

c'Ontr'Ol̲body = 56623117 next = 56623119 

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

om=56623114CONTROLStatement cond= 7340044  control̲oody = 56623115 next = 56623116 

om= 56623123next = 56623122  m = 56623123 next = 2097156 

/

SampleProgram (main)  * /  int main(int argc, char* argv(]){  int ik; 

k=l;  if(k<lO){ 

while(k< 10){  k=aaa( 2)+bbb(k); 

for(i= l;i< 4;i++){ 

CO;}

printf("Hello world!¥n");  k=bbb(5); 

5.

実行結果の解析対象(部分)

実行結果は、制御フローの流れを表現する。少し分かりにくいが、図

5

が対 象プログラムの解析結果となる。

SDA

モ デ ル と デ ー タ 依 存 解 析

SDA4

の依存解析は、すべてのパスを調べ、基本型と構造体について解析す る。ポインタに関しては基本型のみ実装する。現在のパージョンでは関数ごと の解析のみを行い、関数にまたがる解析は提供しない。引数・大域変数につい ても実装されていない。配列の要素についても、インデックスによる区別がで きない。例えば以下の式に対して、最初の式a

[ A ]

から次の文の式bへ依存関係 があるとみなしてしまう。

5 制 御 構 造 と 依 存 解 析 SDAモデル 87 

a [ A ]  

0 ;   b 

a [ B ] ;  

4 . 1

関数外部とのデータの受け渡しの解析

v̲arg

オブジェクトは、関数外部とのデータの受渡しを示す。大域変数の仮 想 的 な 宣 言 、 関 数 内 部 で 変 更 さ れ 外 部 に 影 響 の 及 ぶ 変 数 の 情 報 を 持 つ 。

VARG̲IN

は 関 数 内 で 明 示 的 に 宣 言 さ れ な い 参 照 変 数 ( 主 に 大 域 変 数 ) を 、

VARG OUT

は関数内での変数の値の変更が外部に伝わることを表す。

I n t e g e r   I n t e g e r   I n t e g e r  

6 .

R e l a t i o n

の識別番号

s f u n c

の識別番号

v a r g

の議

5 1

1]番 号

[関連 s f u n c ̲   v a r g   J 

sdafunc

オブジェクトから関連

func̲varg

により

v̲arg

オブジエクトを求め、

そこから関連

varg̲ident

により、外部変数

( i d e n t i f i e r

オブジェクト)を求め

て行く。

I n t e g e r   I n t e g e r   I n t e g e r  

R e l a t i o n

の 識 別 番 号

v a r g

の 識 別 番 号

i d e n t

の 識 別 番 号

[関連 v a r !L i d e n t   J 

88 

S a p i d

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

│sdaオ ブ ジ ェ ク ト

トー│ v

│ 

7 .

解析対象のプログラムシ

2

)

j  

・'・

1 4 +

M I

‑‑炉川町m

m L

M

e a e  

Mr e

M { }   ({ ) 

;  

nl ・副市トhmmM dn

o t E  

k= 1;  l=l+k; 

while(k< 1 Q){  k=add(k)+add(l); 

for(i= 1;i<4;i++){  k+=add(i);  }  prin'("%d %d "lk); 

サンプルプログラムら5 一関数外部とのデータ受け渡しの解析

#include <stdio.h> 

#include <Sapid/Sapid.h> 

#include <Sapid/StmtModel.h> 

#include <SapidjSDAmodel.h> 

void openModel(SpdDBld);  char* getFuncName(SpdObjld); 

?tmm(i

SpdObjldArray sda̲array;  SpdOId idenCid, id, var!Lid;  int  i; 

SpdDBld  dbld;  SpdCursor

stmtr;

dbld = sO nSDBO;

openModel(dbld); 

sda̲array=spdGetObjldArray("sdafunc" NULLNULL); 

5 制 御 構 造 と 依 存 解 析 SDAモデル 89  for (i = 0; i sda̲array.size; i++ ){ 

y~rg,..i~.= spd~叫~191>J(油 arm;j1[j)九funq吋....any..);

ident  id = sndGe仏RelObj(var!Lid."ident̲vaぜ,佃y") print"¥nFUNCfION:%srst‑=  %s %s".getFuncName(idenCid) 

spdFreeObjldArray(sda̲array);  spdCloseSDB(dbld);  return (EXIT̲SUCC郎防,

実行結果

l m m O N

varg FUNCTlON: main varg = 

4 . 2

データ依存解析の実現

.spdGetName(idenUd)); 

SDA4の依存解析は、すべてのパスを調べるので、どのポイントからでも解 析が開始できる。ここでは依存関係のある式のペアをすべて出力する。各式に 対 し て 順 番 に デ ー タ 依 存 関 係 を 求 め る 。 定 義 側 のexpressionを含む式から、

参照側のexpressionを含む式を関連data̲dependにより求める。例題では、

変数kとiの依存関係を分析し、定義、参照それぞれの上位式を関数getTopで 再構成する。ここでは

b l o c k

オブジェクトと関連を持つ式を選ぶ。

blk  expr 

Integer  Integer  Integer 

block 

8

Relationの 識 別 番 号

定 義 側expressionの 識 別 番 号 参 照 側expressionの 識 別 番 号

[関連

data̲depend 

90  Sapidによるソフトウェア解析技法 void main(){ 

intitb

, 

j =k++; 

while(k< 1 O){  k=j + k;  for(i= 1;i<4;i++){ 

k+=i;  }  i = k+j; 

printf("%d %d¥n"i

j); 

サンプルプログラム忌

6

#inc1ude <stdio.h> 

#inc1uc!e <Sapid/Sapid.h> 

#inc1ude <Sapid/StintModel.h> 

#inc1ude <SapidfSDAmodel.h> 

voi~ openModel (SpdDBld);  SpdOlljld ge・'t1op(SpdObjld); int main(int acch町 、 昭v[]) { 

SpdObjldArrayexpr̲array;  SpdObjld  firsUd top;  int  i; 

SpdDBld  dbld;  dbld = s凶OpenSDBO;

openMooel(dbld); 

ー デ ー タ 依 存 解 析

expr̲array=spdtObjIrray("expr'sion"NULLNULL);

for (i= 0; i< expr̲array.si

田;

i++){ 

if((百四Ud=spdGe凶RelOhj(expr̲array.id[i]" data̲depend"、ny"))!=SAPID̲NON̲ID) if(自国Cid< expr̲array.id[im 

top = _tl!'.m~p(~却に!Irr~y ..~[i])j

pnn

げ で ・

%sin "sjJdGetObjText(expr̲aπay.id[i]));  pnn'("%s 

, "

spdGetObjText(top)); 

top =_tl~tTEP(自rsCid);

pnnぜ何一oependonー >%s:¥nヘspdGetOText(top)

top); spdFreeObjIdArray(expr̲array); 

spdCloseSDB(dbId);  retum (EXIT̲SUCCESS); 

関数 g e t T o p 上位の式を求める

SpdObjId getTop(S凶Objldexpr̲id){ 

SpdObjIdp̲id; t,!,p'_i~="x'pr~i~;

while (spdGetAReIObj(tmp̲id

, 

"blk̲expr'γ'any") == SAPID̲NON̲ID) 

p̲id= spdGewteiObj(

回五一

ia"expr=‑expr", "c‑id");  retum tmp̲id; 

実行結果

FUNCI10N  kin 

i

kin 

J n   ‑

1m 

1m 1 m k+;1 ‑‑Deoend on‑‑> 1; 1  k in  i; k +j  ‑‑bepend on‑‑> j ; k++:  j in  i; kサーDependonー>j; k++ 

5 制御構造と依存解析 SDAモデル 91 

ドキュメント内 Sapidによるソフトウェア解析技法 (ページ 88-96)