Hívásgrafikon

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. május 6-án felülvizsgált verziótól ; az ellenőrzések 4 szerkesztést igényelnek .

A hívásgráf ( eng.  Call graph ) a fordítók felépítésének elméletében  egy irányított gráf , amely egy számítógépes program szubrutinjai közötti hívásokat ábrázolja . Konkrétan minden csomópont egy eljárást képvisel, és minden ív (f, g) azt mutatja, hogy az f eljárás meghívja a g eljárást.

A hívási gráf egy programelemzés eredménye, amely felhasználható a program emberi megértésére, vagy további elemzések alapjaként. A hívási grafikon egyik egyszerű felhasználási módja, hogy olyan eljárásokat keressen, amelyeket soha nem hívnak meg.

A hívási grafikon lehet dinamikus vagy statikus. A dinamikus hívási grafikon a program végrehajtásának rekordja. A statikus hívási grafikon a programvégrehajtás összes lehetséges változatát ábrázolja.

Definíció

Egy program hívásgráfja csomópontok és élek halmaza , abban az értelemben, hogy [1]

  1. a program minden eljárása egy csomópontnak felel meg,
  2. minden hívópont, vagyis az a hely a programban, ahol az eljárást meghívják, a gráf egy csomópontjának felel meg,
  3. ha a c hívási pont meg tudja hívni a p eljárást , akkor a gráfnak van egy éle a c csomóponttól a p csomópontig .

Számos programozási nyelven , például C és Fortran írt program közvetlenül kezdeményez eljáráshívásokat, így az egyes hívások célkódja statikusan meghatározható. Ebben az esetben a gráf minden hívási pontjának pontosan egy eljáráshoz van egyedi éle. A közvetett hívások nagyon gyakoriak az objektumorientált programozási nyelvekben.

Példa

Egy olyan C programozási nyelvű program, amely egy globális pf mutatót deklarál egy függvénynek, amely paraméterként veszi és egy egész számot ad vissza . Két ilyen típusú függvény létezik, a fun1 és fun2, valamint egy fő funkció, amelynek típusa nem egyezik a pf mutatóval. A három hívópont c1 , c2 és c3 címkével van ellátva  – ezek a címkék nem részei a programnak [2] .

int ( * pf )( int ); int fun1 ( int x ) { ha ( x < 10 ) c1 : return ( * pf )( x + l ); else return x ; } int fun2 ( int y ) { pf = & fun1 ; c2 : return ( * pf )( y ); } void main () { pf = & fun2 ; c3 : ( * pf )( 5 ); }

A pf legegyszerűbb elemzése a függvények típusainak vizsgálata. A fun1 és fun2 függvények ugyanolyan típusúak, mint a pf mutató, míg a fő funkció más típusú. A program alaposabb elemzése során kiderül, hogy a fő függvényben a pf mutató egyenlővé válik a fun2-vel, majd a fun2 függvényben a fun1 értéket kapja. A programban nincs más hozzárendelés a pf mutatóhoz, így különösen a pf mutató nem mutathat a fő függvényre [2] .

Jegyzetek

  1. Aho, Lam et al., 2008 , p. 1062.
  2. 1 2 Aho, Lam et al., 2008 , p. 1063.

Irodalom

oroszul

  • Alfred W. Aho, Monica S. Lam, Ravi Seti, Jeffrey D. Ullman. Fordítók: alapelvek, technikák és eszközök = Compilers: Principles, Techniques and Tools. - Williams Publishing House, 2008. - ISBN 0-321-48681-1 .

angolul

  • Ryder, BG, "Constructing the Call Graph of a Program", Software Engineering, IEEE Transactions on, vol. SE-5, no.3pp. 216-226, 1979. május [1]
  • Grove, D., DeFouw, G., Dean, J. és Chambers, C. 1997. Hívásgráf konstrukció objektum-orientált nyelveken, SIGPLAN Not. 32, 10 (1997. október), 108-124. [2]
  • Callahan, D.; Carle, A.; Hall, M. W.; Kennedy, K., "Constructing the procedure call multigraph", Software Engineering, IEEE Transactions on, vol.16, no.4pp.483-487, 1990. április [3]