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.
Anropsgrafen för ett program är en uppsättning noder och kanter , i den meningen att [1]
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.
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] .