2012-01-05 7 views
9

निम्न फ़ाइल foo.c मेरे कोड में मिली एक subtler बग का एक सरलीकृत संस्करण है।असाइन किए गए चर के बारे में चेतावनियां कैसे प्राप्त करें, लेकिन अब और उपयोग नहीं की गईं?

int b; 

void bar(int a); 

void foo(int a) 
{ 
    bar(a); 
    a = 42; 
} 

लाइन a = 42 वास्तव में मेरी कोड में कोई गलती है: मैं b = 42 मतलब है। मैं संकलक से यह अनुमान लगाने की अपेक्षा नहीं करता कि मैंने एक टाइपो बनाया है, लेकिन मुझे एक चेतावनी मिलनी है कि मैं एक स्थानीय चर (या एक फ़ंक्शन पैरामीटर) को असाइन कर रहा हूं जिसका अब उपयोग नहीं किया जा रहा है। अगर मैं

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c 

के साथ इस फ़ाइल को संकलित करता हूं तो मुझे बिल्कुल कोई चेतावनी नहीं मिलती है। जेनरेट किए गए कोड का निरीक्षण करने से पता चलता है कि असाइनमेंट a = 42 नहीं किया गया है, इसलिए gcc पूरी तरह से अच्छी तरह से अवगत है कि यह निर्देश बेकार है (इसलिए संभावित रूप से फर्जी)। bar(a); पर कॉल करने पर टिप्पणी करने से warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter] चेतावनी उत्पन्न होती है, इसलिए ऐसा लगता है कि a को तब तक चेतावनी नहीं देगा जब तक कि यह असाइनमेंट से पहले है।

मेरे सवालों का:

  1. वहाँ एक रास्ता जीसीसी या बजना बताने के लिए इस तरह के मामले के लिए एक चेतावनी के उत्पादन के लिए है? (मुझे bar पर कॉल के साथ भी किसी भी चेतावनी का उत्पादन करने के लिए क्लैंग 3.0 नहीं मिल सका।)
  2. क्या वास्तविक व्यवहार का कोई कारण है? मैं, कुछ मामलों में वास्तव में स्थानीय चर को आवंटित करना वांछनीय था जिसे ऑप्टिमाइज़र द्वारा फेंक दिया जाएगा?
+1

एक 'const' समारोह तर्क करें और संकलक शिकायत:' शून्य foo (int स्थिरांक एक) {/ * ... जो कुछ भी ... * /} ' – pmg

+0

@pmg: स्रोत बदलने नहीं है एक विकल्प: मैं अपने मौजूदा कोड बेस में समान बेकार असाइनमेंट का पता लगाना चाहता हूं। – adl

+0

@pmg hehe, nice;) – ouah

उत्तर

4

मेरे ज्ञान के लिए कोई gcc या clang विकल्प नहीं है जो इस बेकार असाइनमेंट के बारे में चेतावनी दे सकता है।

PC-Lint दूसरी ओर इस स्थिति में चेतावनी देने में सक्षम है।

चेतावनी 438 अंतिम चर 'प्रतीक' करने के लिए सौंपा मूल्य इस्तेमाल नहीं किया - एक मूल्य एक चर कि बाद में उपयोग नहीं किया गया करने के लिए आवंटित किया गया था। संदेश या तो रिटर्न स्टेटमेंट पर या ब्लॉक के अंत में जारी किया जाता है जब चर का दायरा समाप्त हो जाता है।

-1

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

+0

जैसा कि मूल प्रश्न में बताया गया है, मैंने पहले से ही 'gcc' को अनुकूलित करने के लिए कहा है, और मैंने पहले से ही ध्यान दिया है कि असाइनमेंट इसे अनुकूलित किया गया है। सवाल यह है कि संकलक मुझे यह नहीं बताएगा कि मैंने कुछ बेकार लिखा है, या मैं इसे कैसे बताने के लिए इसे कॉन्फ़िगर कर सकता हूं। – adl

+0

आप इस प्रश्न का उत्तर नहीं दे रहे हैं। वह चाहता है कि संकलक इस तरह के कोड का पता लगाए, जब प्रोग्रामर ने गलती नहीं देखी (और इसलिए लिस्टिंग फाइलों में खोदना नहीं होगा)। – ugoren

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