El conjunto de entrada del bloque actual es la diferencia entre el conjunto de salida y el conjunto de eliminación, unido con genset. Ahora pasaré por los bloques básicos de la función que mostré anteriormente, y calcularemos los valores de estos conjuntos. Así que comenzaremos desde el fondo del grafo para calcular los conjuntos de este bloque básico. Así que asumiremos que 'from' y 'to' se leen más adelante en la función, por lo que genset se establece en 'from' y 'to', y ignoraremos que hay algo escrito, por lo que el conjunto de eliminación estará vacío. A partir de esto, podemos calcular el conjunto de entrada como 'from' y 'to', y ahora nos moveremos a los predecesores de este bloque. Como el conjunto de entrada del bloque sucesor es 'from' y 'to', podemos decir que el conjunto de salida también es 'from' y 'to', siguiendo la primera regla. En este bloque básico, estamos leyendo el valor de 'arc', por lo que genset es 'arc' y estamos escribiendo los valores de 'from' y 'to', por lo que el conjunto de eliminación es 'from' y 'to'. A partir de esto, podemos calcular el conjunto de entrada como la diferencia entre el conjunto de salida y el conjunto de eliminación. Como estos conjuntos son iguales, la diferencia será vacía. El conjunto de entrada es la unión de vacío con genset, que contiene 'arc'. Por lo tanto, el conjunto de entrada será 'arc'. Ahora nos movemos a otro bloque donde nuevamente el conjunto de salida se establece como el conjunto de entrada del bloque sucesor, por lo que es 'from' y 'to'. Estamos leyendo el valor de 'arc', por lo que genset es 'arc' y estamos escribiendo el valor de 'from'. A partir de esto, podemos calcular que el conjunto de entrada es 'arc' y 'to'. Cuando nos movemos al predecesor de estos dos bloques, podemos establecer el conjunto de salida como la unión del conjunto de entrada de los bloques sucesores, por lo que es 'arc' y 'to'. Estamos leyendo el valor de 'to', por lo que genset es 'to' y no estamos escribiendo ninguna variable, por lo que el conjunto de eliminación está vacío. A partir de esto, podemos calcular el conjunto de entrada como la diferencia entre el conjunto de salida y el conjunto de eliminación, que es 'arc' y 'to', y unirlo con 'to', lo cual no cambia nada. A partir de aquí, nos movemos al predecesor de este bloque, por lo que sabemos que el conjunto de salida es 'arc' y 'to', estamos leyendo el valor de 'arc', por lo que genset es 'arc', estamos escribiendo el valor de 'from', por lo que el conjunto de eliminación contiene 'from', y a partir de esto podemos calcular el conjunto de entrada como 'arc' y 'to'. En el siguiente bloque, la situación es casi idéntica, el conjunto de salida es 'arc' y 'to', estamos escribiendo el valor de 'from', por lo que el conjunto de eliminación es 'from', no estamos leyendo ninguna variable, por lo que genset está vacío. A partir de esto, calculamos el conjunto de entrada como 'arc' y 'to'. Y ahora nos movemos al primer bloque donde el conjunto de salida es 'arc' y 'to', estamos leyendo el valor de 'to', por lo que genset es 'to', no estamos escribiendo ninguna variable, por lo que el conjunto de eliminación está vacío, por lo tanto, podemos calcular el conjunto de entrada como 'arc' y 'to'. Así que ahora hemos calculado los valores de estos bloques básicos. Cada vez que calculamos el conjunto de entrada del bloque, necesitamos recalcular los predecesores de los bloques. Esto es especialmente importante si hay bucles en el grafo, porque necesitaremos continuar hasta que los conjuntos no cambien más. Una vez que esto esté terminado, podemos analizar los valores calculados y detectar los problemas. Generaremos un problema para cada variable que forma parte del conjunto de eliminación, lo que significa que se está escribiendo, pero no forma parte del conjunto de salida del bloque, lo que significa que el valor nunca se necesita en los bloques posteriores. Por lo tanto, en este caso, en nuestra función, 'from()' se escribe al principio, pero no se lee en ningún bloque posterior porque se vuelve a escribir. Por eso generaremos un problema en esta llamada a 'from()'. Si quieres, puedes echar un vistazo a la implementación completa de este algoritmo en nuestro analizador de JavaScript, que es un proyecto de código abierto en GitHub, y el algoritmo se encuentra en la regla 18.54. Este analizador se utiliza en SonarQube, SonarCloud o SonarLink. Espero que hayas encontrado interesante esta charla, y gracias por tu atención. ¡Adiós!
Comments