Dead Code Finder: La dura realtà dell'analisi statica

Ho costruito uno strumento per un hackathon per trovare il codice morto. L'obiettivo era semplice: trovare il codice che non viene chiamato da nulla.

Non volevo sapere cosa si rompe se si elimina del codice. Volevo sapere se qualcosa chiami affatto un determinato frammento di codice.

L'ho chiamato Dead Code Finder. Utilizza un grafo della conoscenza per cercare chiamate e import. Suddivide ogni risultato in tre categorie:

• Sicuro: zero archi in entrata e non è un punto di ingresso. • Incerto: casi come l'ereditarietà in cui l'analisi statica non è sufficiente. • Saltato: elementi come decoratori o framework di test che lo strumento non riesce a risolvere.

Ho seguito una regola ferrea: non dire mai che il codice è sicuro da eliminare. Il report indica solo che non è stata trovata alcuna referenza nel grafo.

Il progetto è stato più difficile del previsto. Ho riscontrato due problemi principali con la piattaforma:

  1. Strumenti mancanti: gli strumenti del grafo mancavano durante l'esecuzione, nonostante fossero presenti nella configurazione.
  2. Iniezione inaffidabile: il sistema a volte non riusciva a fornire l'intera logica per l'agente.

Ho risolto il problema creando una modalità di fallback. Se gli strumenti del grafo mancano, lo strumento legge i file effettivi nel repository. Utilizza ricerche nei file per trovare i riferimenti. Se utilizza questo metodo, contrassegna i risultati come "inferiti".

Ho dovuto anche correggere errori logici per casi specifici:

  • Metodi dunder: metodi come __init__ spesso mostrano zero archi in entrata perché il grafo collega la chiamata alla classe invece che al metodo. Ho risolto il problema controllando la classe contenitrice.
  • Decoratori: le funzioni chiamate tramite ricerche di stringhe in un dizionario sembrano morte per un grafo statico. Le ho spostate nella categoria "Saltato".
  • Test: i framework di test trovano i metodi tramite riflessione. Anche questi finiscono nella categoria "Saltato".

I risultati sono stati affidabili. La mia modalità di fallback ha identificato correttamente il codice morto e ha corrisposto ai dati reali del grafo. Ha inoltre etichettato correttamente i casi incerti come l'ereditarietà.

Lezioni imparate:

  • Confermare la disponibilità degli strumenti prima di scrivere logica che dipenda da essi.
  • Un report che dice "Non lo so" è meglio di un report che è erroneamente sicuro di sé.
  • Etichettare l'incertezza rende i risultati certi degni di essere presi in considerazione.

Source: https://dev.to/hereforlolz/dead-code-finder-gitlab-orbit-based-static-analysis-that-turned-out-to-be-harder-than-expected-4jgk

Optional learning community: https://t.me/GyaanSetuAi