सूचक विश्लेषण

कंप्यूटर विज्ञान में, सूचक विश्लेषण, या पॉइंट-टू-एनालिसिस, एक स्थिर कोड विश्लेषण तकनीक है जो यह निर्धारित करती है कि कौन से सूचक (कंप्यूटर प्रोग्रामिंग) या ढेर संदर्भ, किस चर या भंडारण स्थानों को इंगित कर सकते हैं। यह अधिकांशतः अधिक जटिल विश्लेषणों जैसे पलायन विश्लेषण का एक घटक होता है। एक निकट संबंधी तकनीक बनावट विश्लेषण (सॉफ्टवेयर) है।

(यह शब्द का सबसे आम बोलचाल का उपयोग है। एक द्वितीयक उपयोग में 'सूचक विश्लेषण 'पॉइंट-टू-एनालिसिस दोनों के लिए सामूहिक नाम है, जिसे ऊपर के रूप में परिभाषित किया गया है, और उपनाम विश्लेषण। पॉइंट्स-टू और अलियास विश्लेषण निकटता से संबंधित हैं लेकिन निरंतर समतुल्य समस्याएं नहीं हैं।)

उदाहरण
निम्नलिखित उदाहरण प्रोग्राम के लिए, अंक-टू-विश्लेषण यह गणना करेगा कि अंक-टू-सेट  है {,  }.

परिचय
स्थैतिक विश्लेषण के एक रूप के रूप में, पूरे प्रकार से त्रुटिहीन सूचक विश्लेषण को अनिर्णीत समस्या के रूप में दिखाया जा सकता है। अधिकांश दृष्टिकोण ध्वनि हैं, लेकिन व्यापक रूप से प्रदर्शन और त्रुटिहीनता में हैं। कई डिजाइन निर्णय विश्लेषण की त्रुटिहीनता और प्रदर्शन दोनों को प्रभावित करते हैं; अधिकांशतः (लेकिन निरंतर नहीं) कम त्रुटिहीनता से उच्च प्रदर्शन प्राप्त होता है। इन विकल्पों में सम्मलित हैं:
 * क्षेत्र संवेदनशीलता (संरचना संवेदनशीलता के रूप में भी जाना जाता है): एक विश्लेषण या तो एक रिकॉर्ड (कंप्यूटर विज्ञान) या ऑब्जेक्ट (कंप्यूटर विज्ञान) के प्रत्येक क्षेत्र को भिन्न प्रकार से देख सकता है, या उन्हें मर्ज कर सकता है।
 * ऐरे संवेदनशीलता: एक एरे-संवेदनशीलता सूचक विश्लेषण प्रत्येक इंडेक्स को भिन्न-भिन्न एरे में मॉडल करता है। अन्य विकल्पों में सिर्फ पहली प्रविष्टि को भिन्न प्रकार से और बाकी को एक साथ मॉडलिंग करना, या सभी सरणी प्रविष्टियों को मर्ज करना सम्मलित है।
 * संदर्भ संवेदनशीलता: सूचक विश्लेषण प्रत्येक प्रोग्राम बिंदु पर जाने वाले नियंत्रण प्रवाह के सारांश के साथ सूचना के बिंदुओं को अर्हता प्राप्त कर सकता है।
 * फ्लो संवेदनशीलता: एक विश्लेषण पॉइंट टू फैक्ट्स पर इंट्राप्रोसेरल कंट्रोल फ्लो के प्रभाव को मॉडल कर सकता है।
 * हीप मॉडलिंग: रन-टाइम आवंटन को इसके द्वारा अमूर्त किया जा सकता है:
 * उनकी आवंटन साइटें (बयान या निर्देश जो आवंटन करता है, उदाहरण के लिए, एक कॉल  या एक ऑब्जेक्ट निर्माता),
 * बनावट विश्लेषण (सॉफ्टवेयर) पर आधारित एक अधिक जटिल मॉडल,
 * आवंटन का प्रकार, या
 * एक एकल आवंटन (इसे हीप-असंवेदनशीलता कहा जाता है)।
 * हीप क्लोनिंग: हीप- और संदर्भ-संवेदी विश्लेषण प्रत्येक आवंटन साइट को नियंत्रण प्रवाह के सारांश द्वारा निर्देश या कथन को पूरा करने वाले कथन के लिए अग्रणी बना सकते हैं।
 * उपसमुच्चय बाधाएँ या समानता बाधाएँ: जब तथ्यों के बिंदुओं का प्रचार किया जाता है, तो विभिन्न प्रोग्राम कथन एक चर के बिंदुओं से सेटों पर विभिन्न बाधाओं को प्रेरित कर सकते हैं। समानता की कमी (जैसे स्टीन्सगार्ड के कलन विधि में उपयोग की जाने वाली) को एक संघ-खोज डेटा संरचना के साथ चिह्न किया जा सकता है, जिससे एक उपसमुच्य-बाधा आधारित विश्लेषण (जैसे, एंडरसन के कलन विधि) की त्रुटिहीनता की कीमत पर उच्च प्रदर्शन हो सकता है।

संदर्भ-असंवेदनशील, प्रवाह-असंवेदनशील कलन विधि
सूचक विश्लेषण कलन विधि का उपयोग एकत्रित कच्चे सूचक उपयोगों (एक सूचक को दूसरे के लिए असाइनमेंट या एक सूचक को दूसरे को इंगित करने के लिए असाइन करना) को एक उपयोगी ग्राफ में परिवर्तित करने के लिए किया जाता है जो प्रत्येक सूचक को इंगित कर सकता है। स्टेन्सगार्ड के कलन विधि और एंडरसन के कलन विधि सूचक विश्लेषण के लिए सामान्य संदर्भ-असंवेदनशील, प्रवाह-असंवेदनशील कलन विधि हैं। वे अधिकांशतः कंपाइलर्स में उपयोग किए जाते हैं, और एलएलवीएम कोडबेस में कार्यान्वयन होते हैं।

प्रवाह-असंवेदनशील दृष्टिकोण
प्रवाह-असंवेदनशील सूचक विश्लेषण के कई दृष्टिकोणों को अमूर्त व्याख्या के रूपों के रूप में समझा जा सकता है, जहां हीप आवंटन को उनके आवंटन स्थल (अर्थात, एक प्रोग्राम स्थान) द्वारा सारित किया जाता है।

कई प्रवाह-असंवेदनशील कलन विधि को डेटा लॉग में निर्दिष्ट किया गया है, जिसमें जावा के लिए सूट विश्लेषण ढांचे में सम्मलित हैं। संदर्भ-संवेदनशील, प्रवाह-असंवेदनशील कलन विधि उच्च परिशुद्धता प्राप्त करते हैं, सामान्यतः कुछ प्रदर्शन की कीमत पर, प्रत्येक प्रक्रिया का कई बार विश्लेषण करके, संदर्भ के अनुसार एक बार। अधिकांश विश्लेषण संदर्भ-स्ट्रिंग दृष्टिकोण का उपयोग करते हैं, जहां संदर्भों में प्रविष्टियों की एक सूची होती है (संदर्भ प्रविष्टि के सामान्य विकल्पों में कॉल साइट्स, आवंटन साइट्स और प्रकार सम्मलित हैं)। समाप्ति (और अधिक सामान्यतः, स्केलेबिलिटी) सुनिश्चित करने के लिए, ऐसे विश्लेषण सामान्यतः एक के-सीमित दृष्टिकोण का उपयोग करते हैं, जहां संदर्भ में एक निश्चित अधिकतम बनावट होता है, और कम से कम हाल ही में जोड़े गए तत्वों को आवश्यकतानुसार हटा दिया जाता है। संदर्भ-संवेदनशील, प्रवाह-असंवेदनशील विश्लेषण के तीन सामान्य प्रकार हैं:
 * कॉल-साइट संवेदनशीलता
 * ऑब्जेक्ट संवेदनशीलता
 * संवेदनशीलता टाइप करें

कॉल-साइट संवेदनशीलता
कॉल-साइट संवेदनशीलता में, प्रत्येक वेरिएबल के पॉइंट-टू सेट (अमूर्त ढेर आवंटन का सेट प्रत्येक वेरिएबल को इंगित कर सकता है) प्रोग्राम में कॉलसाइट्स की एक सूची से युक्त एक संदर्भ द्वारा आगे योग्य है। ये संदर्भ प्रोग्राम के नियंत्रण-प्रवाह को अमूर्त करते हैं।

निम्नलिखित प्रोग्राम दर्शाता है कि कैसे कॉल-साइट संवेदनशीलता प्रवाह-असंवेदनशील, संदर्भ-असंवेदनशील विश्लेषण की तुलना में उच्च त्रुटिहीनता प्राप्त कर सकती है। इस प्रोग्राम के लिए, एक संदर्भ-असंवेदनशील विश्लेषण (स्पष्ट रूप से लेकिन अस्पष्ट रूप से) यह निष्कर्ष निकालेगा कि x या तो y या z के आवंटन को इंगित कर सकता है, इसलिए y2 और z2 उपनाम हो सकते हैं, और दोनों या तो आवंटन को इंगित कर सकते हैं। एक कॉलसाइट-संवेदी विश्लेषण आईडी का दो बार विश्लेषण करेगा, एक बार कॉल-साइट 1 के लिए और एक बार कॉल-साइट 2 के लिए, और एक्स के लिए पॉइंट-टू फैक्ट्स कॉल-साइट द्वारा योग्य होंगे, विश्लेषण को यह समझने में सक्षम बनाता है कि जब मुख्य रिटर्न, y2 सिर्फ आवंटन होल्डिंग y को इंगित कर सकता है और z2 सिर्फ आवंटन होल्डिंग z को इंगित कर सकता है।

ऑब्जेक्ट संवेदनशीलता
ऑब्जेक्ट संवेदनशीलता विश्लेषण में, प्रत्येक वेरिएबल के पॉइंट-टू सेट को मेथड कॉल के रिसीवर ऑब्जेक्ट के एब्स्चिह्न्ट हीप आवंटन द्वारा क्वालिफाई किया जाता है। कॉल-साइट संवेदनशीलता के विपरीत, ऑब्जेक्ट-संवेदनशीलता गैर-वाक्यविन्यास या गैर-स्थानीय है: संदर्भ प्रविष्टियां पॉइंट-टू-विश्लेषण के समय ही प्राप्त की जाती हैं।

टाइप संवेदनशीलता
टाइप संवेदनशीलता ऑब्जेक्ट संवेदनशीलता का एक प्रकार है जहां रिसीवर ऑब्जेक्ट की आवंटन साइट को उस वर्ग/प्रकार से बदल दिया जाता है जिसमें रिसीवर ऑब्जेक्ट की आवंटन साइट वाली विधि होती है। इसका परिणाम ऑब्जेक्ट-संवेदनशील विश्लेषण में उपयोग किए जाने वाले संदर्भों की तुलना में बहुत कम संदर्भों में होता है, जिसका सामान्यतः उत्तम प्रदर्शन होता है।