decir que hay dos métodos en mi biblioteca:¿Qué herramienta de análisis estático utilizar para escanear el flujo de datos de un método a otro?
void com.somepackage.SomeClass.someSink(String s)
y
int com.someotherpackage.SomeOtherClass.someSource(int i)
El primer método se utiliza como sumidero de datos, mientras que el segundo como una fuente de datos en mi código . Los parámetros de tipo int, String
se acaban de dar como ejemplo y pueden cambiar en la situación real.
quiero para detectar el uso de estos métodos en un código que satisfacen un cierto patrón se indica a continuación:
- algunos datos (por ejemplo
x
) es generada por la fuente - algunos datos (por ejemplo
y
) se genera utilizando una serie de transformacionesf1(f2(... fn(x))
y
se entrega al receptor.
Las transformaciones pueden ser cualquier función arbitraria, siempre que exista una secuencia de llamadas desde la función que genera los datos del receptor a una función que toma datos de la fuente. Las funciones también pueden tomar otros parámetros y se deben usar como caja negra.
El escaneo puede realizarse en el nivel de código fuente o byte. ¿Cuáles son las herramientas disponibles para este tipo de análisis?
Prefiera las herramientas no basadas en IDE con las API de Java.
[EDIT:] para aclarar más, someSink
y someSource
son nombres métodos arbitrarios en las clases de SomeSome
y SomeOtherClass
respectivamente. Pueden o no ser static
y pueden tomar un número arbitrario de parámetros (que yo debería ser capaz de definir). El tipo de los parámetros tampoco es arbitrario. El único requisito es que la herramienta escanee el código y los números de línea de salida donde ocurre el patrón. Por lo tanto, la herramienta podría funcionar de esta manera:
- Obtenga el receptor y los nombres de fuente (nombre completo de clase y nombre de método) del usuario.
- escanear estáticamente el código y encontrar todos los lugares donde el fregadero y fuente dada se utilizan
- Comprobar si un camino existe, donde se da una cierta salida de datos de la fuente al sumidero, ya sea directa o indirectamente a través de una serie de operaciones (operadores, métodos)
- Ignore esas fuentes/sumideros donde no existe tal ruta y genere las restantes (si las hay).
Ejemplo de salida:
MyClass1.java:12: value1 = com.someotherpackage.SomeOtherClass.someSource(...)
MyClass2.java:23: value2 = foo(value1, ...)
MyClass3.java:3: value3 = bar(value2)
MyClass4.java:22: com.somepackage.SomeClass.someSink(value3, ...)
Nota: Si una función no toma parámetros, pero tiene algunos efectos secundarios de los datos también debe tenerse en cuenta. (El ejemplo a = source(); void foo(){ c = a+b }; foo(); sink(c)
es un patrón que debe capturarse.)
¿Estás describiendo qué es un diagrama de secuencia UML? Si es así, entonces hay muchas herramientas (principalmente comerciales) para hacer esto. – mazaneicha
Es un subconjunto del diagrama de secuencia que satisface los criterios de 'dependencia de datos'. – Jus12
¿Entonces todo lo que realmente quieres es que la segunda clase tenga alguna dependencia indirecta de datos con la primera? –