2012-02-01 8 views
43

मैं कोडबेज में अप्रयुक्त फ़ंक्शंस ढूंढना चाहता हूं - जिसमें संकलन इकाइयों समेत। मैं अपने कंपाइलर के रूप में जीसीसी का उपयोग कर रहा हूँ।अप्रयुक्त कार्यों के बारे में चेतावनी देने का कोई तरीका है?

foo.c (मान उचित foo.h):

void foo() { 
    .... 
} 

void bar() { 
    .... 
} 

main.c:

यहाँ एक उदाहरण है

#include <stdio.h> 
#include "foo.h" 

int main(void) { 
    bar(); 
    return 0; 
} 

इस उदाहरण में, मैं के बारे में foo() नहीं किया जा रहा चेतावनी दी प्राप्त करना चाहते हैं उपयोग किया गया।

-Wunused-function जीसीसी विकल्प नहीं है:

-Wunused-function

चेतावनी दें जब भी एक स्थिर समारोह घोषित नहीं बल्कि परिभाषित या एक गैर इनलाइन स्थिर समारोह अप्रयुक्त है। यह चेतावनी द्वारा सक्षम है -Wall।

लेकिन यह केवल स्थिर कार्यों के लिए है - यह ऊपर दिए गए उदाहरण पर चेतावनी नहीं देगा।

मैं उपकरण/स्क्रिप्ट/अन्य कंपाइलर्स के सुझाव भी स्वीकार करूंगा जो मेरे लिए यह कर सकते हैं - हालांकि यदि संभव हो तो मैं gcc के साथ रहना पसंद करूंगा।

+6

डिफ़ॉल्ट कारण से अप्रयुक्त गैर स्थैतिक कार्यों पर चेतावनी न देने का एक अच्छा कारण है। एक गैर स्थैतिक फ़ंक्शन सार्वजनिक इंटरफ़ेस का हिस्सा है, क्योंकि आप आसानी से एक .a या .so लाइब्रेरी उत्पन्न करने के लिए लिंकर के माध्यम से एक gcc- जेनरेट की गई .o फ़ाइल को खिला सकते हैं जिसमें सभी गैर स्थैतिक फ़ंक्शंस जो भी लिंक पर उपलब्ध कराए जाते हैं पुस्तकालय के साथ। उस ने कहा, यह अभी भी एक अच्छा सवाल है, जो मुझे उम्मीद है कि एक उपयोगी जवाब होगा। –

+3

बिल्कुल, यह डिफ़ॉल्ट रूप से नहीं होना चाहिए। फिर भी, यदि सुविधा मौजूद है तो मैं इसे अंतिम लिंक समय पर चालू करने में सक्षम होना चाहता हूं :) –

+1

प्रासंगिक http: //gcc.gnu।संगठन/एमएल/जीसीसी-सहायता/2003-08/msg00072.html? –

उत्तर

41

Caolan Mc Namara, एक लिबर ऑफिस डेवलपर, ने लिबर ऑफिस स्रोत कोड में इस प्रकार की चीज़ का पता लगाने के लिए एक छोटा सा टूल बनाया है। उनके पास लिबर ऑफिस में हजारों फ़ंक्शन & विधियों का उपयोग नहीं किया गया था। उनका उपकरण उन्हें हटाने के लिए एक महत्वपूर्ण तत्व है।

यह callcatcher कहा जाता है। यह

एकत्र कर सकते हैं कार्यों/तरीकों परिभाषित किया और कहा जाता है/संदर्भित

यह कोडांतरक उत्पादन पर सीधे काम करता है और इसलिए, यह केवल x86 और x86_64 आर्किटेक्चर के लिए काम करता घटाना। यह this जैसे आउटपुट का उत्पादन कर सकता है। आप इसे अपने पारंपरिक संकलन और जीसीसी को कॉल जोड़ने के साथ एकीकृत कर सकते हैं।

Caolan इससे सहमत हैं कि यह एक जीसीसी प्लगइन बन जाना चाहिए।

+0

यह वही है जो मैं चाहता हूं, बॉक्स के बाहर। धन्यवाद! –

+4

यह शानदार है। आपके मनोरंजन मूल्य के लिए, जिस परियोजना पर मैं काम कर रहा हूं, उसमें ** 1257 अप्रयुक्त कार्य ** है। मुझे लगता है कि इस कोड बेस में कुछ से अधिक हो सकता है ... –

3

सबसे पहले, यदि आप ऐसी चेतावनियां प्रोग्राम-व्यापी होना चाहते हैं, तो आपको निश्चित रूप से -flto ध्वज की आवश्यकता है, क्योंकि इसे प्रत्येक व्यक्तिगत इकाई के संकलन के समय लिंक समय पर हल किया जाना चाहिए। लेकिन मुझे नहीं लगता कि जीसीसी इस तरह की चेतावनियां भी प्रदान करता है।

फिर, सामान्य मामले में, मैं समझूंगा कि इसे प्रदान करना बुद्धिमान नहीं होगा (क्योंकि उदा। libc में आपके आवेदन की आवश्यकता नहीं है)। इसके अलावा, एक आवेदन dlsym चाल इस्तेमाल कर सकते हैं एक जाहिरा तौर पर अनावश्यक समारोह तक पहुँचने के लिए ...

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

आप गतिशील रूप से अप्रयुक्त (ज्ञात नहीं) कार्यों को प्राप्त करने के लिए प्रोफाइलिंग तकनीकों का भी उपयोग कर सकते हैं।

ईमेल द्वारा मुझसे और पूछने के लिए स्वतंत्र महसूस करें।

+1

+1 धन्यवाद। अगर मैं जीसीसी प्लगइन रूट पर जा रहा हूं तो मैं लगभग आपको एक ईमेल भेजूंगा :) –

+0

मैं सी –

+0

@ बेसिलस्टारनकेविच में जीसीसी प्लगइन की तुलना में एमईएलटी एक्सटेंशन पर आपकी मदद करने के लिए और अधिक योग्य हूं: शायद आप यह देखने में दिलचस्पी होगी कि कैओलान मैक नमारा ने इसके बारे में क्या किया है। अधिक जानकारी के लिए मेरा जवाब देखें। – Coren

3

मुझे पता है कि आपने चेतावनियों के लिए कहा है और जीसीसी विकल्प का उपयोग न करना पसंद करते हैं लेकिन यह वास्तव में आसान है।

आप अपने आवेदन से मृत कोड को हटाने के लिए लिंकर अनुकूलन (--gc-section) का उपयोग कर सकते हैं।

जीसीसी के आदमी पृष्ठ से:

--gc वर्गों --no-जीसी वर्गों अप्रयुक्त इनपुट वर्गों के कचरा संग्रहण सक्षम करें।इसे उन लक्ष्यों पर नजरअंदाज कर दिया जाता है जो इस विकल्प का समर्थन नहीं करते हैं। डिफ़ॉल्ट व्यवहार (इस कचरा संग्रह नहीं करने) को कमांड लाइन पर --no-gc-section निर्दिष्ट करके पुनर्स्थापित किया जा सकता है।

--gc-section तय करता है कि प्रतीकों और स्थानान्तरण की जांच करके कौन से इनपुट अनुभाग का उपयोग किया जाता है। एंट्री प्रतीक वाले अनुभाग और कमांड लाइन पर अपरिभाषित प्रतीकों वाले सभी अनुभागों को रखा जाएगा, जैसा कि गतिशील वस्तुओं द्वारा संदर्भित प्रतीक वाले अनुभाग होंगे। ध्यान दें कि साझा पुस्तकालयों का निर्माण करते समय, लिंकर को यह मानना ​​चाहिए कि किसी भी दृश्यमान प्रतीक का संदर्भ दिया गया है। एक बार जब प्रारंभिक वर्गों का यह निर्धारित सेट निर्धारित हो गया है, तो लिंकर रिकर्सिव रूप से उनके स्थानान्तरण द्वारा संदर्भित किसी भी खंड के रूप में चिह्नित होता है। देखें - एंड्री और --ंडीefined।

यह विकल्प जब एक आंशिक लिंक (विकल्प -r के साथ सक्षम) कर सेट किया जा सकता। इस मामले में रखा गया प्रतीकों की जड़ को या तो एंट्री या --ंडीefined विकल्प या लिंकर स्क्रिप्ट में "ENTRY" कमांड द्वारा स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए।

+3

अफसोस की बात है कि मैं बाइनरी से कोड को हटाने की कोशिश नहीं कर रहा हूं - मुझे यह पता लगाना है कि स्रोत के कौन से हिस्सों को –

+5

साफ़ किया जा सकता है यदि मुझे सही याद है, तो एक वर्बोजिटी विकल्प है जो ऑप्टिमाइज़ेशन की एक सूची मुद्रित करेगा जीसी-सेक्शन द्वारा किया गया था। मुझे लगता है कि यह "--print-gc-section" है – eyalm

1

ग्रहण CDT कोड विश्लेषण, जो आप अप्रयुक्त स्थिर कार्यों और अप्रयुक्त समारोह घोषणाओं (अन्य उपयोगी बातों के अलावा) चिह्नित करने के लिए सेट कर सकते हैं करता है। जैसा कि पहले ही कहा था, केवल लिंकर कुछ (गैर स्थिर) समारोह बता सकते हैं कुछ बाइनरी में उपयोग नहीं किया गया था ...

1

gprof सरल समाधान मुझे लगता है कि है। मैं नमूना कार्यक्रम आप -pg विकल्प के साथ डाल दिया संकलित ताकि हम gmon.out जब हम a.out (जो gprof बाद में उपयोग कर सकते हैं) को चलाने के लिए और फिर मैं अंत में gprof -z a.out gmon.out | tee output.txt भाग गया। अप्रयुक्त सूची में मुझे आपका फ़ंक्शन foo मिल सकता है! i.e 0 बार कहा जाता है। अप्रयुक्त रूटीन को ट्रैक करने के लिए -z वह विकल्प है जिसका उपयोग आपको gprof के साथ उपयोग करना चाहिए।

उचित सूचक के लिए this धागा करने के लिए धन्यवाद!

पीएस: gprof आपके अप्रयुक्त फ़ंक्शन foo के साथ अन्य अप्रयुक्त लाइब्रेरी फ़ंक्शंस को फेंक दिया। मुझे गंभीरता से यह नहीं पता कि इसे कैसे फ़िल्टर किया जाए :)

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

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