निम्न फ़ाइल 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
को तब तक चेतावनी नहीं देगा जब तक कि यह असाइनमेंट से पहले है।
मेरे सवालों का:
- वहाँ एक रास्ता जीसीसी या बजना बताने के लिए इस तरह के मामले के लिए एक चेतावनी के उत्पादन के लिए है? (मुझे
bar
पर कॉल के साथ भी किसी भी चेतावनी का उत्पादन करने के लिए क्लैंग 3.0 नहीं मिल सका।) - क्या वास्तविक व्यवहार का कोई कारण है? मैं, कुछ मामलों में वास्तव में स्थानीय चर को आवंटित करना वांछनीय था जिसे ऑप्टिमाइज़र द्वारा फेंक दिया जाएगा?
एक 'const' समारोह तर्क करें और संकलक शिकायत:' शून्य foo (int स्थिरांक एक) {/ * ... जो कुछ भी ... * /} ' – pmg
@pmg: स्रोत बदलने नहीं है एक विकल्प: मैं अपने मौजूदा कोड बेस में समान बेकार असाइनमेंट का पता लगाना चाहता हूं। – adl
@pmg hehe, nice;) – ouah