2009-12-10 17 views
19

मैं उन कार्यों को हटाने की कोशिश कर रहा हूं जिनका उपयोग C++ प्रोजेक्ट से नहीं किया जाता है। समय के साथ यह फूला हुआ हो गया है और मैं उन कार्यों को हटाने की तलाश में हूं जो बिल्कुल उपयोग नहीं किए जाते हैं।पता लगाएं कि सी ++ प्रोजेक्ट में कोई फ़ंक्शन कॉल किया गया है या नहीं?

मेरे पास विजुअल स्टूडियो में एक समाधान फ़ाइल में सभी परियोजनाएं हैं, लेकिन मैं cmake का उपयोग करता हूं ताकि यदि आवश्यक हो तो मैं अन्य आईडीई के लिए प्रोजेक्ट फाइलें उत्पन्न कर सकता हूं (यही कारण है कि यह दृश्य-स्टूडियो के साथ टैग नहीं किया गया है)।

मौजूद कुछ इस तरह है? जहां यह स्रोत का विश्लेषण करेगा और मुझे बताएगा कि कौन से कार्यों को नहीं कहा जाता है। मैंने पीसी-लिंट को यहां कुछ प्रश्नों में वर्णित देखा, लेकिन ऐसा नहीं लगता है।

मैं वास्तव में क्या करना चाहता हूं, प्रत्येक फ़ंक्शन पर "सभी संदर्भ ढूंढें" को कॉल करें और बुलाए गए कार्यों को हटा दें, लेकिन इसे मैन्युअल रूप से करने में बहुत अधिक समय लगेगा।

+0

+1 मैं एक ही मुद्दा रहा था: एक विरासत परियोजना की जाँच की परियोजना/समाधान फ़ाइलों की जरूरत नहीं है में, ओएस खोज (और विंडोज़ खोज बेकार) के आधार पर उन परियोजनाओं को कैसे लिंक कर सकते हैं ... –

+0

मेरी इच्छा है कि कोई इसके लिए ओपन सोर्स समाधान के नाम से आ सकता है। – BlueTrin

+0

आमतौर पर इस तरह के मामलों में मैं फ़ंक्शन के कार्यान्वयन (बॉडी) पर टिप्पणी करता हूं, और देखता हूं कि यह लिंक – valdo

उत्तर

9

फ़ंक्शन घोषणा के सामने __declspec(deprecated) का उपयोग करें, जिसे आप छुटकारा पाने के लिए चाहते हैं। अगर संकलन समय पर वास्तव में उपयोग किया जाता है तो वह संकलन चेतावनियां फेंक देगा।

+0

मुझे इसके बारे में पता नहीं था, मैं निश्चित रूप से इस और अधिक देख लूंगा। – Joe

+0

यह वह समाधान है जिसका उपयोग मैं समाप्त करने जा रहा हूं, इसलिए मैं इसे उत्तर के रूप में चिह्नित करूंगा। यह मेरे लिए अच्छा काम करता है क्योंकि _declspec (dllimport deprecated) काम करता है। मैं _declspec (dllimport) बनाम _declspec (dllexport) बनाम हूं, इसलिए मैं सिर्फ एक स्थान प्रति डीएल संशोधित कर सकता हूं और देख सकता हूं कि क्या दिखाता है। सब कुछ कम से कम एक बार दिखाया गया है क्योंकि सब कुछ एक शरीर है। मैंने कंपाइलर से आउटपुट को पार्स करने के लिए अजगर का उपयोग किया और प्रत्येक वर्ग/फ़ंक्शन को कितनी बार बहिष्कृत किया गया है इसका हिस्टोग्राम बना दिया। फिर मैं सबसे कम संख्या वाले लोगों को अधिक बारीकी से देखता हूं। – Joe

0

मुझे लगता है कि एक फ़ंक्शन को हटाने का सबसे आसान तरीका है (या कक्षा, परिवर्तनीय, जो कुछ भी आपको लगता है वह अनियंत्रित है) और फिर देखें कि यह संकलित है या नहीं। यदि फ़ंक्शन का उपयोग किया जाता है तो आपको पुनर्निर्माण के दौरान किसी बिंदु पर एक संकलन या लिंक त्रुटि मिल जाएगी।

आम तौर पर आपको घोषणा के बजाए परिभाषा को हटा देना चाहिए, अन्यथा ओवरलोडेड फ़ंक्शंस और विशेष टेम्पलेट्स जैसी चीजों के साथ यह संकलित हो सकता है और दूसरों में से एक से लिंक हो सकता है, त्रुटि उत्पन्न नहीं कर सकता बल्कि प्रोग्राम व्यवहार को बदल सकता है। परिभाषा को हटाकर, संकलक अभी भी घोषणा देखता है, लेकिन लिंकर इसे लिंक करने में विफल रहेगा।

आइटम जो घोषित किए गए हैं लेकिन परिभाषित नहीं हैं, अगर उनका उपयोग नहीं किया जाता है तो त्रुटि नहीं होती है, क्योंकि लिंकर कभी भी उनसे लिंक करने का प्रयास नहीं करेगा।

+2

फिंगर्स पार कर गया है, यह गतिशील रूप से लोड नहीं होता है ... –

+1

यदि आप अपने प्रोजेक्ट की संरचना को जानते हैं तो यह कार्य जानने के लिए पर्याप्त है गतिशील रूप से संदर्भित नहीं किया गया है (यानी रनटाइम पर फ़ंक्शन के लिए प्रतीक लुकअप है) तो मुझे लगता है कि यह आपकी सबसे अच्छी शर्त है। मैं यही करता हूं। – Omnifarious

+4

फिंगर्स ने पार किया कि परियोजना को बनाने में 30 मिनट लगते हैं। –

3

लगता है जैसे आपको कोड कवरेज टूल चाहिए। इस wikipedia article में उनकी एक सूची है।

+3

क्यों? कोई परीक्षण कोड भी मौजूद नहीं हो सकता है। – reinierpost

+1

कोई परीक्षण कोड मौजूद नहीं है। एक कोड कवरेज टूल काम नहीं करेगा क्योंकि अगर हम हर मामले में हिट करते हैं तो हमें कोई जानकारी नहीं होगी। – Joe

+0

कोड कवरेज टूल को आवश्यक परीक्षण कोड की आवश्यकता नहीं है - कुछ को उत्पादन वातावरण में सामान्य कोड पर चलाया जा सकता है। –

3

उत्कृष्ट (और) स्रोत मॉनिटर स्थिर विश्लेषण उपकरण, http://www.campwoodsw.com/ से आप एक पद्धति के लिए कॉल है, जो मुझे लगता है कि तुम क्या चाहते है की संख्या की गिनती दे सकते हैं।

संपादित करें: मेरी शाम को खराब करने के लिए लगता है। कॉल मीट्रिक वास्तव में ऐसा नहीं करता जो मैंने सोचा था। फिर भी, एसएम एक उत्कृष्ट उपकरण है इसलिए मुझे उम्मीद है कि इसे लोगों के ध्यान में लाने से कुछ अच्छा हो गया है!

+0

मैंने सोर्स मॉनिटर की कोशिश की है और मुझे लगता है कि एक विधि के लिए कॉल आंकड़े इस विधि को बुलाए जाने की संख्या नहीं है, लेकिन इस विधि के अन्य तरीकों से कॉल की संख्या। अगर कोई गलत है तो कृपया मुझे सही करें। – BlueTrin

+0

हां, आप सही प्रतीत होते हैं। इसके बारे में खेद है - यह एक मीट्रिक नहीं है जिसका मैं वास्तव में उपयोग करता हूं। फ़ंक्शन पॉइंटर्स लाने के लिए –

1

यदि आपका कोड सरल है तो पर्याप्त स्थिर विश्लेषण काम कर सकता है। हालांकि सी ++ बहुत संदर्भ-संवेदनशील है: /। तो मैं व्यक्तिगत रूप से क्षेत्र में एक उपकरण की तलाश करने की कोशिश भी नहीं करता। कम से कम तब तक जब तक सीएलएएनजी सी ++ के साथ पूरी तरह से अनुपालन नहीं करता है: डी

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

यह कर मैन्युअल रूप से हालांकि जैसा कुछ नहीं है: डी

1

दृश्य स्टूडियो कॉल रेखांकन उत्पन्न कर सकते हैं, दिखा प्रत्येक कार्य के लिए 'कहा जाता है-द्वारा'। यदि आप विजुअल स्टूडियो का उपयोग नहीं करना चाहते हैं तो डॉक्सिजन वही करेगा।

हालांकि ये दोनों विधियां पॉइंटर के माध्यम से बुलाए गए फ़ंक्शन का पता लगाने में असफल हो जाएंगी, लेकिन सामान्य रूप से मैन्युअल रूप से जांचना आसान होना चाहिए।

+0

+1, हालांकि मैं असहमत हूं कि मैन्युअल रूप से जांचना हमेशा आसान होगा। पूरी अवधारणा के साथ मेरी एकमात्र समस्या यह है कि क्योंकि संभावित नियंत्रण पथ आपके द्वारा लिखे गए मॉड्यूल से संबंधित संख्या में घातीय होंगे, इसलिए संभवतः उन्हें 100% निश्चितता से सुरक्षित करना असंभव है जब तक कि सभी कार्य स्थिर रूप से जुड़े न हों। –

+0

मैंने कहा कि यह सामान्य रूप से * आधार पर आसान होगा कि फ़ंक्शन पॉइंटर्स अक्सर कोड आधार के भीतर बड़े पैमाने पर उपयोग नहीं किए जाते हैं। मेरा मतलब प्रयास के संदर्भ में था, जरूरी जटिलता नहीं; मैं कोड के साथ एक निश्चित परिचितता मान रहा हूँ; उदाहरण के लिए यदि यह आपका कोड था, तो आप शायद जानते होंगे कि आपने फ़ंक्शन पॉइंटर्स का उपयोग किया था या नहीं! – Clifford

+0

पर्याप्त मेला। मैंने वास्तव में वहां आपके मुंह में शब्दों को रखा था। –

1

यदि आप जानना चाहते हैं, गतिशील रूप से, कौन से फ़ंक्शंस का उपयोग किया जा रहा है, तो आप कॉलकैप हुक डालने के लिए (vC++) कंपाइलर प्राप्त कर सकते हैं और फिर उपयोग जानकारी को डंप करने के लिए उपयोग कर सकते हैं।

यह स्थिर विश्लेषण आधारित दृष्टिकोणों के लिए उपयोगी तारीफ हो सकता है, क्योंकि यह निष्पादन के दौरान दर्ज किए गए कोड के प्रत्येक टुकड़े को देखेगा (चाहे निष्पादन कैसे होता है)।

दृश्य स्टूडियो में कॉल प्रोफाइल हुक पर जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms254291(VS.80).aspx देखें।

2

मुझे यकीन है कि गणितीय रूप से, यह सामान्य मामले में नहीं किया जा सकता है। यदि आप रिकर्सन और फ़ंक्शन पॉइंटर्स (या प्रथम श्रेणी फ़ंक्शंस) की अनुमति देते हैं तो आप हैल्टिंग समस्या में एक बहुत ही सरल कमी में समाप्त होते हैं।

दी, यह एक मामला आप से निपटने के लिए है कि कभी नहीं हो, लेकिन आप यह abut पता होना चाहिए ...

+0

यही वह बिंदु है जिसे मैं अपनी टिप्पणी में क्लिफोर्ड के जवाब में बना रहा था। आपने उत्तर पोस्ट किया, आपको अंक मिलते हैं :) .. +1 –

संबंधित मुद्दे