Un gráfico de llamadas ( ing. Call graph ) en la teoría de compiladores de construcción es un gráfico dirigido que representa llamadas entre subrutinas en un programa de computadora . En particular, cada nodo representa un procedimiento, y cada arco (f, g) muestra que el procedimiento f llama al procedimiento g.
Un gráfico de llamadas es el resultado de un análisis de programa que se puede utilizar para la comprensión humana del programa o como base para un análisis posterior. Un uso simple del gráfico de llamadas es buscar procedimientos que nunca se llaman.
El gráfico de llamadas puede ser dinámico o estático. El gráfico de llamadas dinámicas es un registro de la ejecución del programa. El gráfico de llamadas estáticas pretende representar todas las variantes posibles de ejecución del programa.
El llamado grafo de un programa es un conjunto de nodos y aristas , en el sentido de que [1]
Muchos programas escritos en lenguajes de programación como C y Fortran realizan llamadas de procedimiento directamente, de modo que el código de destino de cada llamada se puede determinar de forma estática. En este caso, cada punto de llamada en el gráfico tiene un borde único para exactamente un procedimiento. Las llamadas indirectas son muy comunes en los lenguajes de programación orientados a objetos.
Un programa en el lenguaje de programación C que declara un puntero global pf a una función que toma como parámetro y devuelve un número entero . Hay dos funciones de este tipo, fun1 y fun2, y una función principal cuyo tipo no coincide con el puntero pf. Los tres puntos de llamada están etiquetados como c1 , c2 y c3 ; estas etiquetas no forman parte del programa [2] .
int ( * pf ) ( int ); int fun1 ( int x ) { si ( x < 10 ) c1 : retorno ( * pf )( x + l ); si no devuelve x ; } int fun2 ( int y ) { pf = & diversión1 ; c2 : retorno ( * pf )( y ); } vacío principal () { pf = & diversión2 ; c3 : ( * pf )( 5 ); }El análisis más simple de lo que pf podría señalar es examinar los tipos de funciones. Las funciones fun1 y fun2 son del mismo tipo que el puntero pf, mientras que la función principal es de un tipo diferente. Un análisis más cuidadoso del programa revela que el puntero pf en la función principal se vuelve igual a fun2, y luego en la función fun2 se le asigna el valor fun1. No hay otras asignaciones al puntero pf en el programa, por lo que, en particular, el puntero pf no puede apuntar a la función principal [2] .