Dead Code Finder: De harde realiteit van statische analyse

Ik heb voor een hackathon een tool gebouwd om dead code te vinden. Het doel was simpel: code vinden die door niets wordt aangeroepen.

Ik wilde niet weten wat er kapot gaat als je code verwijdert. Ik wilde weten of er überhaupt iets naar een specifiek stuk code verwijst.

Ik noemde het Dead Code Finder. Het gebruikt een knowledge graph om te zoeken naar calls en imports. Het sorteert elke bevinding in drie categorieën:

• Zeker: nul inkomende edges en geen entry point. • Onzeker: gevallen zoals overerving waarbij statische analyse niet voldoende is. • Overgeslagen: zaken zoals decorators of test frameworks die de tool niet kan oplossen.

Ik hanteerde één strikte regel: zeg nooit dat code veilig is om te verwijderen. Het rapport zegt alleen dat er geen referentie in de graph is gevonden.

Het project was lastiger dan verwacht. Ik liep tegen twee hoofdproblemen aan met het platform:

  1. Ontbrekende tools: de graph tools ontbraken tijdens runtime, ook al stonden ze in de config.
  2. Onbetrouwbare injectie: het systeem slaagde er soms niet in om de volledige logica voor de agent te leveren.

Ik heb dit opgelost door een fallback-modus te bouwen. Als de graph tools ontbreken, leest de tool de daadwerkelijke bestanden in de repository. Het gebruikt file searches om referenties te vinden. Als deze methode wordt gebruikt, worden de bevindingen gemarkeerd als 'inferred'.

Ik moest ook logische fouten oplossen voor specifieke gevallen:

  • Dunder-methoden: Methoden zoals __init__ tonen vaak nul inkomende edges omdat de graph de call koppelt aan de class in plaats van aan de methode. Ik heb dit opgelost door de omliggende class te controleren.
  • Decorators: Functies die via string lookups in een dictionary worden aangeroepen, lijken 'dead' voor een statische graph. Ik heb deze verplaatst naar de 'Skipped'-categorie.
  • Tests: Test frameworks vinden methoden via reflection. Deze gaan ook naar de 'Skipped'-categorie.

De resultaten waren betrouwbaar. Mijn fallback-modus identificeerde dead code correct en kwam overeen met de echte graph-data. Het labelde ook onzekere gevallen zoals overerving correct.

Lessen geleerd:

  • Controleer of tools beschikbaar zijn voordat je logica schrijft die ervan afhankelijk is.
  • Een rapport dat zegt "Ik weet het niet" is beter dan een rapport dat met stelligheid ongelijk heeft.
  • Het labelen van onzekerheid zorgt ervoor dat je zekere bevindingen echt bruikbaar zijn.

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

Optionele leercommunity: https://t.me/GyaanSetuAi