En un código similar a cada uno de los ejemplos siguientes, me gustaría poder analizar el código de forma estática para determinar la lista de valores posibles que pasan a SpecialFunction().C# Análisis estático, valores posibles para una variable/parámetro
SpecialFunction(5); // A
int x = 5;
SpecialFunction(x); // B
int x = 5;
x = condition ? 3 : 19;
SpecialFunction(x); // C
ya puedo analizar el C# en un árbol de sintaxis abstracta y ya puedo manejar casos como A, y supongo que pude realizar un seguimiento de las asignaciones iniciales de los valores de adivinar el caso B, pero los casos tan fácil como C parece complicarse rápidamente.
Estoy casi seguro de que no podremos resolver para x en todos los casos estáticamente y eso está bien. Me gustaría saber estrategias para intentarlo, formas de reconocer cuándo no se puede hacer. ¿Qué pasa si tenemos que incluir campos de nivel de clase y multi-threading? Cierres? ¿Ayudaría si sabemos que para el conjunto X
de todos los valores posibles para x
, |X| < 50
?
De la sugerencia de @Vladimir Perevalov, ¿cómo podrían los conceptos en Pex pueden aplicar a la búsqueda de posibles valores para el código de puntos específicos (en lugar de lo Pex parece hacer lo que es descubrir las rutas de código y los valores que conducen a sin marcar (?) casos excepcionales)?
+1. No crea que es un "deber" de análisis estático adivinar la posible falla/éxito del rango de valores del parámetro especificado, es más probable que sea el "deber" del "análisis dinámico". Pero incluso si es así, en * este * caso solo se trata de una * pareja * de parámetros, ¿qué ocurre si se ocupa de una función, por ejemplo, 'IEnumerable GetValuesForx (...) '? –
Tigran
@Tigran: ejecutar o simular el programa (o fragmento) no es una opción. Además, es evidente que hay ALGUNOS casos en que el análisis estático puede proporcionar la respuesta, y es evidente que ALGUNOS casos en los que no podría hacerlo. Intento identificar y alcanzar los casos donde podría. –