2011-03-21 14 views
10

me encontré con un problema de este fin de semana, donde el método 1 método 2 que llama llama al método 3, que llamó la excepción, y en el manejo de excepciones método 1 llamaron otra vez ...Busco a una herramienta de análisis recursividad

M1 -> M2 -> M3 -> M1 ....

El problema se hizo obvio y fácil de solucionar, una vez que ocurrió el problema.

¿Alguien sabe de una herramienta para detectar problemas como este en una aplicación .NET?

+0

El análisis del tiempo de compilación (estático) para detectar la recursión no enlazada es bastante difícil de hacer. No creo que haya ninguna herramienta en el espacio .NET que pueda ayudarlo. – Steven

+0

@Steven - sí, no pude encontrar nada con respecto a una herramienta ... lo más cercano que llegué fue un artículo de ACM al respecto ... crucé los dedos cuando publiqué la pregunta. – Sam

+0

¿Desea detectar la recursión arbitraria? O específicamente, recursión que ocurre a través de un manejador de excepciones? –

Respuesta

2

Gendarme captará algunos (los más comunes, pero básicos) casos de recurrencias. MS FxCop también tiene algunos (IIRC). Sin embargo, ninguno tiene reglas (actualmente) para cubrir casos más complejos como: M1-> M2-> M3-> M1 ...

Lamentablemente no conozco ninguna otra herramienta que pueda hacer tal detección para .NET. Por favor, comparta cualquier cosa que encuentre :-)

+0

NDepender. Ver http://stackoverflow.com/questions/1683091/how-to-find-recursion-in-your-app – reinierpost

5

Para hacer esto bien, necesita un gráfico de llamadas global sobre la aplicación C#, calculado usando semántica C# y lo que equivale a un análisis de puntos, incluyendo las bibliotecas que llama. Con un gráfico de llamadas de este tipo, podría enumerar los ciclos en él, y esos serían los candidatos a verificar.

No sé de dónde obtendría una herramienta que calcule un gráfico de llamada global para C#, listo para usar.

Puede obtener una aproximación usando técnicas sencillas de escaneo de códigos. Para cada método M, extraiga el conjunto aparente de llamadas que contiene como identificadores I. En su mayoría, aparecerán como sintaxis que se parece al identificador () Después de este paso, tiene M_i -> I. Puede construir esto como un (extremadamente conservador) gráfico de llamadas básicas, y luego calcular el cierre transitivo. Con eso, usted tiene un gráfico de llamadas aproximado con ciclos, y puede llevar a cabo su análisis de ciclo. Esto pasaría los métodos masivos por nombres y otros casos, pero podría ser lo suficientemente bueno

+0

No es exactamente la respuesta que estaba buscando (una herramienta) sino un buen resumen de la complejidad de la tarea (lo que explica, un poco, la falta de tales herramientas). Gracias – poupou

Cuestiones relacionadas