Pregunta

Me estoy poniendo en práctica un programa gráfico de llamadas para un C utilizando script de perl. Me pregunto cómo los gráficos de llamada determinación de los punteros de función utilizando la salida de 'objdump'? ¿Qué tan distintos punteros de función aplicaciones determinación grafo de llamadas? Se resuelven los punteros de función en tiempo de ejecución o que se pueden hacer de forma estática?

Editar Cómo hacer gráficos de llamadas ciclos de resolver de evaluación estática del programa?

¿Fue útil?

Solución

Es fácil construir un gráfico de llamadas de llamadas A-B-cuando la instrucción de llamada menciona explícitamente B. Es mucho más difícil de manejar las llamadas indirectas, como se ha notado.

Buena herramientas de análisis estático forman las estimaciones de los contenidos de variables de puntero mediante la propagación de las asignaciones de puntero / copias / aritmética a través de los datos del programa flujos (inter e intra-procesal [ "global"]), utilizando una variedad de esquemas, a menudo conservador ( "usted reciba una dosis excesiva").

Sin tal estimación, no se puede tener ninguna idea de lo que un puntero contiene y por lo tanto, simplemente no puede hacer una predicción útil (así, puede utilizar la estimación definitiva conservadora que va a ir a ninguna parte, pero creo que ya ha rechazado esa solución).

Nuestra software DMS Reingeniería Toolkit tiene estática de control / de flujo de datos / puntos-a / llamada gráfico de análisis que se ha aplicado a sistemas de enormes (~~ 25 millones de líneas ) de código C, y gráficas tales llamadas producidas. La maquinaria para hacer esto es bastante complejo, pero se puede encontrar en temas avanzados en la literatura compilador. Dudo que desea implementar esto en Perl.

Esto es más fácil cuando se tiene el código fuente, porque sabes que al menos fiable lo que es el código, y lo que no lo es. Usted está tratando de hacer esto en código objeto, lo que significa que ni siquiera puede eliminar datos.

Otros consejos

El uso de punteros de función es una manera de elegir la función real de llamar en tiempo de ejecución, por lo que, en general, no sería posible saber lo que realmente ocurriría de forma estática.

Sin embargo, usted podría mirar a todas las funciones que son posibles para llamar y tal vez mostrar los de alguna manera. A menudo, las devoluciones de llamada tienen una firma única suficiente (no siempre).

Si quieres hacerlo mejor, hay que analizar el código fuente, para ver qué funciones están asignadas a los punteros, para empezar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top