2013-05-14 7 views
12

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

इसलिए मैंने नेटबीन्स में "संदर्भ खोजें" और "कॉल ग्राफ दिखाएं" का उपयोग कर चर मैक्रोज़ फ़ंक्शन इत्यादि को हटा देना शुरू कर दिया। मैं c/C++ के लिए netbeans रिमोट डेवलपमेंट टूल का उपयोग कर रहा हूं। लेकिन यह बोझिल है। तो क्या यह साफ करने के लिए कोई उपकरण है ??

+1

शायद [क्लैंग स्थिर विश्लेषक] (http://clang-analyzer.llvm.org/) अर्थपूर्ण विश्लेषण के लिए? –

+0

असल में, क्लैंग सामान्य संकलन के दौरान भी अप्रयुक्त चर और कार्यों पर चेतावनी देता है। – ltjax

+1

ऐसा लगता है कि यह कठिन है। आप कैसे जानते हैं कि #include का उपयोग नहीं किया गया है? मेरा मतलब है कि आपके पास # डिफिन की तरह कुछ हो सकता है जो 'malloc_dbg()' पर 'malloc_dbg()' पर है और फिर यह उस फ़ाइल को शामिल किए बिना और बिना संकलित करता है, केवल व्यवहार में परिवर्तन होता है। – sharptooth

उत्तर

9

क्या मुझे पता है कि वर्तमान में कोई उपकरण है जो सभी चीजों को आपने उल्लेख किया है करता है से, लेकिन वहाँ एक है कि सफाई अप्रयुक्त शीर्ष लेख शामिल करने में मदद करता है: include-what-you-use

"शामिल करें क्या आप का उपयोग "इसका मतलब है: प्रत्येक प्रतीक (प्रकार, फ़ंक्शन वैरिएबल, या मैक्रो) के लिए जो आप foo.cc में उपयोग करते हैं, या तो foo.cc या foo.h # उस फ़ाइल को शामिल करना चाहिए जो उस प्रतीक की घोषणा को निर्यात करता है। इसमें शामिल हैं-आप-उपयोग उपकरण एक प्रोग्राम है जिसे क्लैंग लाइब्रेरीज़ के साथ बनाया जा सकता है ताकि को खोजने के लिए स्रोत फ़ाइलों के समावेशन का विश्लेषण किया जा सके- आप किस प्रकार के उल्लंघन का उपयोग करते हैं, और उनके लिए फ़िक्स का सुझाव देते हैं।

शामिल करने का मुख्य लक्ष्य-आप-उपयोग का उपयोग अनिवार्य # शामिल करने के लिए है। यह दोनों यह पता लगाने के द्वारा करता है कि # फ़ाइल को वास्तव में इस फ़ाइल (.cc और .h फ़ाइलों दोनों के लिए) के लिए आवश्यक नहीं है, और # को प्रतिस्थापित करने के साथ-साथ आगे की घोषणाओं के साथ शामिल करता है।

एक उम्मीद कर सकते हैं कि Clang static analyzer इस करना होगा, लेकिन मैं क्या the availalbe checks देखने से ऐसी बातें नहीं करते हैं।

यह विश्लेषक suggest a feature request को किसी के लिए एक अच्छा समय हो या Clang Tools

इस बीच में वर्णित उपकरणों के साथ एक समान बराबर LibTooling का उपयोग कर एक अलग उपकरण बना सकता है, मैं तुम्हें सक्षम सुझाव देंगे - दीवार और -Wextra संकलक झंडे, जो (दूसरों के बीच) के बाद चेतावनी ट्रिगर किया जाएगा (नीचे जीसीसी डॉक्स देखें):

  • -Wunused-समारोह
  • -Wunused-लेबल
  • -Wunused-मूल्य
  • -Wunused-चर
  • -Wunused पैरामीटर
  • -Wunused बल्कि सेट पैरामीटर

यदि के लिए कुछ कारण आप ऐसा नहीं करना चाहते हैं, तो आप केवल जोड़ सकते हैं- का उपयोग किया गया है जो केवल उपर्युक्त विकल्पों को संयुक्त करेगा, बिना किसी अन्य झंडे के - जो वाल या -वेक्स्ट्रा जोड़ता है।

लेकिन आदेश एक अप्रयुक्त समारोह पैरामीटर बारे में एक चेतावनी प्राप्त करने के लिए, आप निर्दिष्ट करना होगा या तो -Wextra -Wunused (ध्यान दें कि -Wall तात्पर्य -Wunused), या अलग से -Wunused पैरामीटर निर्दिष्ट करें।

बेशक , इसका मतलब है आप सफाई करना है कि मैन्युअल

आप अतिरिक्त पंडिताऊ आप के रूप में अच्छी -pedantic जोड़कर त्रुटियों में सभी चेतावनियों कन्वर्ट कर सकती होना चाहते हैं -errors ध्वज

अधिक जानकारी के लिए GCC Warnings Options documentation पढ़ें।

2

मैं कभी कभी के रूप में कोड का एक बड़ा ब्लॉक अंकन की पद्धति का उपयोग किया "का प्रयोग नहीं किया"

#if 0 
    ... lots of code 
#endif 

जोड़कर फिर आप कोड संकलन और देखो क्या गलत हो जाता है कर सकते हैं। आपको "अविकसित varibale एक्स" त्रुटियों का विश्लेषण करें और इसके लिए जरूरी बिट्स को दोबारा स्थापित करें। आप इसे #if 0 ब्लॉक (#endif जोड़कर, फिर एक नया #if 0 थोड़ा और नीचे) जोड़कर या वर्तमान ब्लॉक से आवश्यक टुकड़ों को स्थानांतरित करके कर सकते हैं।

उदाहरण के लिए, यदि आपके पास वैश्विक चर या मैक्रोज़ का ब्लॉक है, तो बस उन सभी के आसपास #if 0 डालें, और देखें कि वास्तव में कौन से उपयोग किए जाते हैं। [हालांकि #ifdef और ऐसे में उपयोग किए जाने पर मैक्रोज़ थोड़ा और मुश्किल हो सकता है।

मुझे आश्चर्य होगा कि वहां कोई उपकरण नहीं है, लेकिन साथ ही, आपको अभी भी काटने का काम करना है, और एक बार जब आपके पास #if 0 ... #endif में कोड का बड़ा हिस्सा हो, तो यह बहुत आसान है इसे काट दें।

+0

मैं इसे मैन्युअल रूप से कर सकता हूं और मैं इसे वर्तमान में कर रहा हूं। लेकिन मैं स्वचालित रूप से स्रोत का विश्लेषण करने के लिए टूल के बारे में पूछ रहा था और मुझे हटाने के लिए चीजें दिखा रहा था। उदाहरण: जावा के लिए ग्रहण या नेटबीन में, आईडीई अप्रयुक्त चर या अप्रयुक्त आयात इत्यादि दिखाता है .. – Sreekar

+0

'#if 0' नाम लुकअप के कारण बहुत सुरक्षित नहीं है - उदा। यदि एक हेडर '#if 0' का उपयोग करके मिटा दिया गया था, तो संकलक बस एक फ़ंक्शन (जिसे कहा जाता है) का उपयोग कर सकता है जहां उस फ़ंक्शन को बाहरी दायरे में भी घोषित किया जाता है।चूंकि अधिकांश लोग स्पष्ट रूप से स्कॉप्स को अर्हता प्राप्त नहीं करते हैं, इसलिए दृष्टिकोण के बिना नाम लुकअप से संबंधित बग पेश करने की क्षमता है। – justin

0

कई स्थिर कोड विश्लेषण टूल आपको जो जानकारी चाहते हैं उसे प्रदान करते हैं। Wikipedia has a list। हमने such a tool (कुछ कस्टम परिवर्तनों के साथ) को सफलतापूर्वक उपयोग करने और संकलन समय को तेज़ करने के लिए सफलतापूर्वक उपयोग किया है।

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