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" ,NULL,NULL);
for (i = 0; i < sda̲a町ay.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(SpdO均Idtop̲id,
SpdObjld next̲id){SpdObjld 伽lP̲id; SpdCursor 'strnt.一 回r'
strnCcsr=spdGetReIObjlnit(日間Cid,"next̲strntγp‑id"); while((tmp̲id = spd白tRelO
。 旬
trnt一間))!= SAPID̲NON̲ID){if(回ldd>白rsUd){
}
getN回tStmt(trnp̲id);日prinぜ("¥n"); printf("¥tfrorn =%d ,"fil四Ud);
getNex諸 国tSort(spdGetARelId(自rsCid,回p̲id,NULL)"first̲id); }pnnd("nextz%d'Imp id);
else{
}
printf(町n¥t台orn= %d
, "
firsCid);getNextSuhtSod(号p.dGe凶ReTld(日rsCid,trnp̲id,NULL),百四Ud);
prinぜ"("next= %d
, "
trnp.ーid); spdFreeCu四or(strnt四r);第5章 制 御 構 造 と 依 存 解 析 SDAモデル 85
関数 g e S t m t S o r t
一次の文の種類を求めるv'OidgetN剖 StmtSo凶(SpdRelIdstate̲RelId, SpdObjld自rsUd){
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");b問ak;} default
printf("Other Statement "); } getStmt(first̲id); END:
関数 g e t S t m t
次の文を求めるv'OidgetS回t(SpdObjld自rsUd){
SpdO切Id 四prーid
,
decl̲id,
expr 1̲id;実行結果(部分)
FUNCTION(SDA): 56623138自rst=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 i,k;
k=l; if(k<lO){
while(k< 10){ k=aaa( 2)+bbb(k);
for(i= l;i< 4;i++){
C白O;}
printf("Hello world!¥n"); k=bbb(5);
図
5.
実行結果の解析対象(部分)実行結果は、制御フローの流れを表現する。少し分かりにくいが、図
5
が対 象プログラムの解析結果となる。N
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
M吐r e
‑ M { } ({ )
;
nl ・副市トhmmM d剖n
o t E
V
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 ,"l,k);
サンプルプログラムら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; SpdO匂Id idenCid, id, var!Lid; int i;
SpdDBld dbld; SpdCursor
・
stmt白r;dbld = s凶O肺 nSDBO;
openModel(dbld);
sda̲array=spdGetObjldArray("sdafunc" ,NULL,NULL);
第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:%s自rst‑= %s %s".getFuncName(idenCid)
spdFreeObjldArray(sda̲array); spdCloseSDB(dbld); return (EXIT̲SUCC郎防,
実行結果
l m m O N
副 varg= 1 FUNCTlON: main varg = 14 . 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̲dependJ
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 a培,c,ch町 、 昭v[]) {
SpdObjldArrayexpr̲array; SpdObjld firsUd top; int i;
SpdDBld dbld; dbld = s凶OpenSDBO;
openMooel(dbld);
ー デ ー タ 依 存 解 析
expr̲array=spd白tObjI品rray("expr'田sion",NULL,NULL);
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ヘspdGetO切Text(top)
,
top); spdFreeObjIdArray(expr̲array);spdCloseSDB(dbId); retum (EXIT̲SUCCESS);
関数 g e t T o p 上位の式を求める
SpdObjId getTop(S凶Objldexpr̲id){SpdObjId回p̲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
kinJ n ‑
m1m
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