में "अनियंत्रित उपयोग" चेतावनी मैं चेतावनी स्तर -Wall -Wextra
के साथ g ++ का उपयोग कर रहा हूं और चेतावनियों को त्रुटियों (-Werror
) के रूप में उपयोग कर रहा हूं।जी ++ कंपाइलर
अब मुझे कभी-कभी त्रुटि मिल रही है "परिवर्तनीय इस फ़ंक्शन में अनियमित उपयोग किया जा सकता है"।
"कभी-कभी" मेरा मतलब है कि मेरे पास दो स्वतंत्र संकलन इकाइयां हैं जिनमें दोनों एक ही हेडर फ़ाइल शामिल हैं। एक संकलन इकाई त्रुटि के बिना संकलित करता है, दूसरा उपर्युक्त त्रुटि देता है।
हेडर फ़ाइलों में कोड का प्रासंगिक टुकड़ा निम्नानुसार है। चूंकि फ़ंक्शन बहुत लंबा है, इसलिए मैंने केवल नीचे प्रासंगिक बिट को पुन: उत्पन्न किया है।
सटीक त्रुटि है:
'cmpres' इस समारोह
में अप्रारंभीकृत इस्तेमाल किया जा सकता और मैं नीचे *
द्वारा त्रुटि के साथ लाइन में चिह्नित किया है।
for (; ;) {
int cmpres; // *
while (b <= c and (cmpres = cmp(b, pivot)) <= 0) {
if (cmpres == 0)
::std::iter_swap(a++, b);
++b;
}
while (c >= b and (cmpres = cmp(c, pivot)) >= 0) {
if (cmpres == 0)
::std::iter_swap(d--, c);
--c;
}
if (b > c) break;
::std::iter_swap(b++, c--);
}
(cmp
एक functor है कि दो संकेत x
और y
0 या +1 लेता है और रिटर्न -1, अगर *x < *y
, *x == *y
या *x > *y
क्रमशः। अन्य चर एक ही सरणी में संकेत दिए गए हैं है।)
कोड का यह टुकड़ा एक बड़े कार्य का हिस्सा है लेकिन परिवर्तनीय cmpres
का उपयोग कहीं और है। इसलिए मैं समझने में असफल रहा कि यह चेतावनी क्यों उत्पन्न हुई है। इसके अलावा, संकलक स्पष्ट रूप से समझता है कि cmpres
कभी भी प्रारंभ नहीं किया जाएगा (या कम से कम, यह हमेशा चेतावनी नहीं देता है, ऊपर देखें)।
क्यों असंगत व्यवहार:
अब मैं दो प्रश्न हैं? क्या यह चेतावनी एक ह्युरिस्टिक द्वारा उत्पन्न की गई है? (यह व्यवहार्य है क्योंकि इस चेतावनी को उत्सर्जित करने के लिए नियंत्रण प्रवाह विश्लेषण की आवश्यकता होती है जो सामान्य मामले में एनपी कठिन होता है और हमेशा नहीं किया जा सकता है।)
चेतावनी क्यों? मेरा कोड असुरक्षित है? मैं इस विशेष चेतावनी की सराहना करने आया हूं क्योंकि उसने मुझे अन्य मामलों में बग का पता लगाने के लिए बहुत कठिन से बचाया है - इसलिए कम से कम कभी-कभी एक वैध चेतावनी है। क्या यह यहां वैध है?
बस 'int cmpres = 0;' के लिए '(;;) 'लूप के बाहर' और अपने जीवन के साथ आगे बढ़ें;) – fredoverflow
@Fred मेरी समस्या चेतावनी नहीं लेनी है, लेकिन यह देखने के लिए कि क्या चेतावनी वास्तव में * सही * है और मैं यह भी नोटिस करने के लिए बहुत मूर्ख हूं कि मेरे कोड में कोई त्रुटि है। –