dicono che ci sono due metodi della mia biblioteca:Quale strumento di analisi statica utilizzare per la scansione del flusso di dati da un metodo all'altro?
void com.somepackage.SomeClass.someSink(String s)
e
int com.someotherpackage.SomeOtherClass.someSource(int i)
Il primo metodo è utilizzato come dissipatore di dati, mentre il secondo come fonte di dati nel mio codice . I parametri di tipo int, String
vengono forniti a titolo di esempio e potrebbero cambiare nella situazione attuale.
voglio rilevare l'utilizzo di questi metodi in un codice che soddisfano un certo modello indicato di seguito:
- alcuni dati (diciamo
x
) viene generato dalla sorgente - alcuni dati (diciamo
y
) viene generato utilizzando una serie di trasformazionif1(f2(... fn(x))
- viene assegnato al sink.
Le trasformazioni possono essere qualsiasi funzioni arbitrarie finché v'è una sequenza di chiamate dalla funzione che genera i dati per il lavandino per una funzione che prende in dati dall'origine. Le funzioni possono assumere anche altri parametri e devono essere utilizzate come black-box.
La scansione può essere al livello sorgente o codice byte. Quali sono gli strumenti disponibili là fuori per questo tipo di analisi?
Preferisci strumenti non IDE con API Java.
[EDIT:] chiarire più, someSink
e someSource
sono metodi arbitrari nomi delle classi SomeSome
e SomeOtherClass
rispettivamente. Possono o non possono essere static
e possono assumere un numero arbitrario di parametri (che dovrei essere in grado di definire). Anche il tipo dei parametri non è arbitrario. L'unico requisito è che lo strumento esegua la scansione del codice e dei numeri di riga di output in cui si verifica il modello. Quindi lo strumento potrebbe funzionare in questo modo:
- Ottenere i nomi di sink e origine (nome completo della classe e nome del metodo) dall'utente.
- staticamente la scansione del codice e trovare tutti i luoghi dove il lavandino data e la fonte siano utilizzati
- Verificare se un percorso esiste in cui viene dato un po 'di dati in uscita dal fonte di affondare, direttamente o indirettamente, tramite una serie di operazioni (operatori, metodi).
- Ignora le sorgenti/i sink in cui non esiste un percorso di questo tipo e restituisce i restanti (se presenti).
uscita Esempio:
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: Se una funzione non prende parametri ma ha alcuni effetti collaterali sui dati deve anche essere considerato. (L'esempio a = source(); void foo(){ c = a+b }; foo(); sink(c)
è uno schema che deve essere catturato.)
Stai descrivendo cos'è un diagramma di sequenza UML? Se sì, allora ci sono molti strumenti (principalmente commerciali) per farlo. – mazaneicha
È un sottoinsieme del diagramma di sequenza che soddisfa i criteri 'dipendenza dai dati'. – Jus12
Quindi tutto ciò che si vuole veramente è che la seconda classe abbia una dipendenza dai dati indiretti sulla prima? –