2017-09-28 14 views
14

एक बार फिर How to fix this segmentation error in a sequence inverting program? में एक बेवकूफ अप्रारंभीकृत चर त्रुटि।मुझे इस छोटे उदाहरण में जीसीसी से "अप्रयुक्त प्रारंभिक" चेतावनी क्यों नहीं मिल रही है?

तो मैं "-Wall झंडे का उपयोग करें" टिप्पणी दोहराने जा रहा था, लेकिन जब मैंने चेतावनियों के खिलाफ कोड का परीक्षण किया, तो मुझे अपने महान आश्चर्य की कोई चेतावनी नहीं मिली।

तो मैं इसे इस नीचे के लिए कांट छांट (इस कोड निष्पादन उद्देश्यों के लिए कोई मतलब नहीं है, लेकिन यह दिखाता है कि मैं क्या दिखाना चाहते हैं):

#include <stdio.h> 

int main() 
{ 

    int i,len=12; 

    /* printf("%d\n",i); */ 

    while(i!=len-1) 
    { 

    i++; 
    len--; 
    } 

return 0; 
} 

जब यह संकलन gcc 4.7.3 और 6.2.1 का उपयोग कर

gcc -Wall -Wextra -pedantic 

मुझे कोई चेतावनी मिल का उपयोग करते हुए, जबकि i टूक while पाश में उपयोग करने से पहले आरंभ नहीं किया है।

अब अगर मैं printf बयान uncomment मैं:

warning: 'i' is used uninitialized in this function [-Wuninitialized] 

तो क्यों चेतावनी जारी की है जब iprintf लेकिन while परीक्षा में नहीं गुजर?

(यह क्योंकि मेरे मामले में gcc failing to warn of uninitialized variable के अलग है, वहाँ कोई शाखाएं हैं है)

(एक बग की तरह लगता है, लेकिन यह इतना तुच्छ है कि मुझे आश्चर्य है अगर मैं कुछ बड़ा लापता नहीं कर रहा हूँ है।)

+0

क्यों i = 0 असाइन नहीं करते? –

+11

@ डॉजीक ने क्या आपने सवाल पढ़ा? – bolov

+0

क्या आप अलग-अलग परिणाम प्राप्त करते हैं यदि आप भाषा मानक के विशिष्ट संस्करणों को -std = .... के माध्यम से मजबूर करते हैं? – SirDarius

उत्तर

7

यह है, यह एक बग है कहना कठिन है क्योंकि gcc अनुकूलन के लिए और चेतावनी बनाने, जो भी इस विशेष चेतावनी के लिए प्रलेखित है के लिए कोड को मिक्स:

-Wuninitialized
चेतावनी दें यदि स्वचालित चर के बिना पहले प्रारंभ किया जा रहा है या अगर एक चर एक setjmp कॉल द्वारा clobbered जा सकता है प्रयोग किया जाता है। [...]
क्योंकि इन चेतावनियों अनुकूलन पर निर्भर करते हैं, सटीक चर या तत्व जिसके लिए वहाँ चेतावनी है सटीक अनुकूलन विकल्प और जीसीसी के संस्करण का उपयोग किया पर निर्भर करता है।

(जीसीसी डॉक्स Options to Request or Suppress Warnings, जोर खदान से) आप यहाँ एक IMHO बहुत मूर्खतापूर्ण मामले पाया। -O1 की कोशिश करो और आप एक अप्रत्याशित चेतावनी दी जाएगी:

warn.c: In function ‘main’: 
warn.c:13:6: warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized] 
    i++; 
    ^

तो, gcc अभी भी पहले अप्रारंभीकृत उपयोग याद करते हैं, लेकिन दूसरा एक पाता है! -O0 या -O2 आज़माएं और चेतावनी फिर से चली गई है ...

आप अभी भी इसके बारे में एक बग फाइल करने का प्रयास कर सकते हैं। नोट clang यह सही हो जाता है:

warn.c:10:9: warning: variable 'i' is uninitialized when used here 
     [-Wuninitialized] 
    while(i!=len-1) 
     ^
warn.c:6:8: note: initialize the variable 'i' to silence this warning 
    int i,len=12; 
    ^
     = 0 
1 warning generated. 
+2

इसके लिए पहले से ही एक बग है: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=18501 – bolov

+1

मैं अब गंभीरता से जीसीसी छोड़ने पर विचार कर रहा हूं ... धन्यवाद। –

+0

@bolov दिलचस्प;) लेकिन जिस तरह से जीसीसी दस्तावेज इस चेतावनी को कहता है कि यह वास्तव में एक बग है ... –

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