Pregunta

¿Qué problemas esperan encontrar utilizando el análisis de gráficos de llamadas estáticas en un programa? FXCOP utiliza el análisis de gráficos de llamadas estáticas, ¿qué problemas se encuentra utilizando esta técnica?

http://msdn.microsoft.com/library/bb429476.aspx
http://en.wikipedia.org/wiki/callgraph

Disculpas por mi falta de conocimiento, encontré información a través de Google, pero temo que esté muy incompleta. ¡Gracias!

¿Fue útil?

Solución 2

Esto es lo que he encontrado:

Los gráficos de llamadas se utilizan para detectar problemas con respecto a la ejecución del programa, la violación de las pautas recomendadas y posibles ataques de inyección de código.

Al crear un gráfico de las relaciones de llamadas entre varios métodos, es fácil ver dónde pueden surgir problemas en ciertos momentos en los que se llaman ciertos métodos o cómo se llaman ciertos métodos. Es fácil ver cuándo un procedimiento/función puede estar violando las pautas como la modularidad del código de mantenimiento. Es fácil ver dónde podría inyectarse el código malicioso en ciertos puntos debido a las relaciones que llaman y cómo están estructurados. De esta manera, los gráficos de llamadas proporcionan contexto al análisis estático, produciendo resultados más precisos.

Dado que FXCOP usa gráficos de llamadas estáticas, solo puede especular en lo anterior hasta cierto punto.

Otros consejos

Por sí mismo, el gráfico de llamadas es solo eso; No hay gráficos de llamadas "incorrectas" (a menos que tenga una verificación de estilo que prohíba la recursión).

El verdadero problema es que para comprender cómo el código en un punto del programa podría ser problemático, generalmente necesita comprender la forma del mundo (qué estructuras de datos están en vivo, qué valores pueden contener, qué relaciones podrían tener) en el momento donde ese punto de código está activo. El gráfico de llamadas muestra cómo la ejecución puede llegar al punto de interés del código, y todo el código en esa ruta del gráfico de llamadas establece el contexto de ejecución del código. Esto permite al analizador estático producir un análisis "sensible al contexto", que ofrece respuestas mucho más precisas.

Esto lleva a un segundo problema: ¿cómo se obtiene un gráfico de llamadas preciso? Si tiene una llamada directa de B de A, es fácil de escribir, "A Llamas B" y siente que este es un hecho preciso de llamadas. Pero si A hace una llamada a través de un puntero indirecto (¿puedes decir envío del método virtual?) De repente no está tan claro exactamente a quién llama; Terminas con A-Might-Call-B1, A-Might-Call-B2, ... que uno realmente llama de hecho depende del contexto en el que se ejecute ... Oops, necesitas el gráfico de llamadas para fabricar el gráfico de llamadas. El tipo de buena noticia es que construyes el gráfico de llamadas desde abajo: "Sé que esto es seguramente cierto, por lo que eso seguramente debe ser cierto". En los lugares donde el Analzyer no puede resolverlo, generalmente hace una suposición conservadora: ("Todas estas llamadas podrían ser posibles, no puedo descartarlos"). Ese conservadurismo es una de las causas clave de la precisión de su analizador estático.

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