Dead Code Finder: स्टॅटिक अनालिसिसचे (Static Analysis) कठीण वास्तव

मी हॅकाथॉनसाठी डेड कोड (dead code) शोधण्यासाठी एक टूल तयार केले. त्याचे उद्दिष्ट साधे होते: असा कोड शोधणे ज्याला कोणीही कॉल करत नाही.

कोड डिलीट केल्यास काय बिघडेल हे मला जाणून घ्यायचे नव्हते. मला फक्त हे जाणून घ्यायचे होते की एखादा विशिष्ट कोड भाग प्रत्यक्षात कोणी कॉल करतो का.

मी त्याला Dead Code Finder असे नाव दिले. हे कॉल्स (calls) आणि इम्पोर्ट्स (imports) शोधण्यासाठी नॉलेज ग्राफचा (knowledge graph) वापर करते. हे प्रत्येक शोधलेल्या गोष्टीचे तीन श्रेणींमध्ये वर्गीकरण करते:

• Confident: शून्य इनकमिंग एडजेस (incoming edges) आणि तो एन्ट्री पॉइंट (entry point) नाही. • Uncertain: इनहेरिटन्ससारखी (inheritance) प्रकरणे जिथे स्टॅटिक अनालिसिस पुरेसे नसते. • Skipped: डेकोरेटर्स (decorators) किंवा टेस्ट फ्रेमवर्क्ससारख्या गोष्टी जे टूल सोडवू शकत नाही.

मी एक कडक नियम पाळला. कोड डिलीट करणे सुरक्षित आहे असे कधीही म्हणू नका. रिपोर्टमध्ये फक्त एवढेच म्हटले जाते की ग्राफमध्ये कोणताही संदर्भ (reference) सापडला नाही.

हा प्रकल्प माझ्या अपेक्षेपेक्षा जास्त कठीण होता. मला प्लॅटफॉर्ममध्ये दोन मुख्य समस्या आल्या:

  1. Missing Tools: कॉन्फिगरेशनमध्ये असूनही रनटाइम दरम्यान ग्राफ टूल्स उपलब्ध नव्हते.
  2. Unreliable Injection: सिस्टम कधीकधी एजंटसाठी पूर्ण लॉजिक प्रदान करण्यात अपयशी ठरली.

मी 'फॉलबॅक मोड' (fallback mode) तयार करून हे सोडवले. जर ग्राफ टूल्स उपलब्ध नसतील, तर टूल रिपॉझिटरीमधील प्रत्यक्ष फाइल्स वाचते. संदर्भ शोधण्यासाठी ते फाईल सर्चचा वापर करते. जर या पद्धतीचा वापर केला, तर ते शोधलेल्या गोष्टींना 'inferred' म्हणून चिन्हांकित करते.

मला विशिष्ट प्रकरणांसाठी लॉजिक एरर्स देखील सुधाराव्या लागल्या:

  • Dunder methods: __init__ सारख्या मेथड्स अनेकदा शून्य इनकमिंग एडजेस दाखवतात कारण ग्राफ कॉलला मेथडऐवजी क्लासशी जोडतो. मी एनक्लोजिंग क्लास (enclosing class) तपासून हे सुधारले.
  • Decorators: डिक्शनरीमधील स्ट्रिंग लूकअपद्वारे कॉल केल्या जाणाऱ्या फंक्शन्स स्टॅटिक ग्राफमध्ये 'डेड' वाटतात. मी त्यांना 'Skipped' श्रेणीत हलवले.
  • Tests: टेस्ट फ्रेमवर्क्स रिफ्लेक्शनद्वारे (reflection) मेथड्स शोधतात. हे देखील 'Skipped' श्रेणीत जातात.

निकाल विश्वसनीय होते. माझ्या फॉलबॅक मोडने डेड कोड अचूकपणे ओळखला आणि वास्तविक ग्राफ डेटाशी जुळला. त्याने इनहेरिटन्ससारख्या अनिश्चित प्रकरणांना देखील अचूकपणे लेबल केले.

शिकलेले धडे:

  • ज्या लॉजिकवर ते अवलंबून आहेत, ती लिहिण्यापूर्वी उपलब्ध टूल्सची खात्री करा.
  • "मला माहित नाही" असे म्हणणारा रिपोर्ट, आत्मविश्वासाने चुकीचा असणाऱ्या रिपोर्टपेक्षा चांगला असतो.
  • अनिश्चिततेवर लेबल लावल्यामुळे तुमचे 'confident' निष्कर्ष कृती करण्यायोग्य बनतात.

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