Anropsdiagram

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 6 maj 2020; kontroller kräver 4 redigeringar .

En anropsgraf ( eng.  Call graph ) i teorin om att bygga kompilatorer  är en riktad graf som visar anrop mellan subrutiner i ett datorprogram . I synnerhet representerar varje nod en procedur, och varje båge (f, g) visar att proceduren f kallar proceduren g.

En anropsgraf är resultatet av en programanalys som kan användas för mänsklig förståelse av programmet, eller som underlag för vidare analys. En enkel användning av samtalsdiagrammet är att leta efter procedurer som aldrig anropas.

Anropsdiagrammet kan vara dynamiskt eller statiskt. Den dynamiska anropsgrafen är en registrering av programexekvering. Den statiska anropsgrafen är avsedd att representera alla möjliga varianter av programexekvering.

Definition

Anropsgrafen för ett program är en uppsättning noder och kanter , i den meningen att [1]

  1. varje procedur i programmet motsvarar en nod,
  2. varje larmpunkt, det vill säga platsen i programmet där proceduren anropas, motsvarar en nod i grafen,
  3. om anropspunkten c kan anropa proceduren p , har grafen en kant från nod c till nod p .

Många program skrivna på programmeringsspråk som C och Fortran gör proceduranrop direkt, så att målkoden för varje samtal kan bestämmas statiskt. I detta fall har varje larmpunkt i grafen en unik kant till exakt en procedur. Indirekta anrop är mycket vanliga i objektorienterade programmeringsspråk.

Exempel

Ett program i programmeringsspråket C som deklarerar en global pekare pf till en funktion som tar som en parameter och returnerar ett heltal . Det finns två funktioner av denna typ, fun1 och fun2, och en huvudfunktion vars typ inte matchar pf-pekaren. De tre larmcentralerna är märkta c1 , c2 och c3  - dessa etiketter ingår inte i programmet [2] .

int ( * pf )( int ); int fun1 ( int x ) { om ( x < 10 ) c1 : return ( * pf )( x + l ); annars returnerar x ; } int fun2 ( int y ) { pf = & kul1 ; c2 : return ( * pf )( y ); } void main () { pf = & kul2 ; c3 : ( * pf )( 5 ); }

Den enklaste analysen av vad pf kan peka på är att undersöka typerna av funktionerna. Fun1- och fun2-funktionerna är av samma typ som pf-pekaren, medan huvudfunktionen är av en annan typ. En mer noggrann analys av programmet avslöjar att pekaren pf i huvudfunktionen blir lika med fun2, och sedan i funktionen fun2 tilldelas den värdet fun1. Det finns inga andra tilldelningar till pf-pekaren i programmet, så i synnerhet kan pf-pekaren inte peka på huvudfunktionen [2] .

Anteckningar

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

Litteratur

på ryska

  • Alfred W. Aho, Monica S. Lam, Ravi Seti, Jeffrey D. Ullman. Compilers: Principles, Techniques and Tools = Compilers: Principles, Techniques and Tools. - Williams Publishing House, 2008. - ISBN 0-321-48681-1 .

på engelska

  • Ryder, BG, "Constructing the Call Graph of a Program", Software Engineering, IEEE Transactions on, vol. SE-5, nr.3pp. 216-226, maj 1979 [1]
  • Grove, D., DeFouw, G., Dean, J. och Chambers, C. 1997. Anropsgrafkonstruktion i objektorienterade språk, SIGPLAN Not. 32, 10 (okt. 1997), 108-124. [2]
  • Callahan, D.; Carle, A.; Hall, M.W.; Kennedy, K., "Constructing the procedure call multigraph", Software Engineering, IEEE Transactions on, vol.16, nr.4pp.483-487, apr 1990 [3]