2013-06-22 7 views
11

के लिए चेतावनी दी है नहीं करता है मुझे आश्चर्य है कि क्यों जीसीसी (4.6.3) मुझे इस उदाहरण में पहुँच योग्य नहीं कोड के लिए कोई चेतावनी देता है:जीसीसी नहीं पहुंचा जा सकता कोड

#include <stdio.h> 

int status(void) 
{ 
    static int first_time = 1; 

    if (first_time) { 
     return 1; 
     first_time = 0; /* never reached */ 
    } else { 
     return 0; 
    }  
} 

int main(int argc, const char *argv[]) 
{ 
    printf("first call %d\n", status()); 
    printf("second call %d\n", status()); 
    return 0; 
} 

ध्यान दें, दोषपूर्ण status() के प्रयोजन एक स्थिति बनाए रखने के लिए समारोह था। मुझे -Wall के साथ इसके लिए चेतावनी मिलने की उम्मीद थी। मैंने -Wunreachable-code, -Wextra, -pedantic और -ansi (जैसा कि here पर चर्चा की गई थी) की कोशिश की। फिर भी, उनमें से कोई भी मुझे चेतावनी नहीं देता है।

ऐसा लगता है कि जीसीसी चुपचाप स्थैतिक चर असाइनमेंट को हटा देता है।

मेरी राय में gcc विकल्प -Wall -Werror को एक त्रुटि फेंकनी चाहिए।

उत्तर

0

आपके कोड में कोई गलती नहीं है .. आप वापसी का उपयोग करते हैं, इसलिए प्रोग्राम फ़ंक्शन स्थिति छोड़ देता है और पहले_टाइम = 0 तक नहीं पहुंचता है लेकिन जीसीसी के लिए कोई गलती नहीं है क्योंकि वापसी का लक्ष्य कुछ तक नहीं पहुंचना है कोड का हिस्सा एक उदाहरण:

int  main(int argc, char **argv) 
{ 
    if (argc != 2) 
     return (-1); 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
    //many code 
} 

तो इस उदाहरण में कीवर्ड वापसी कार्यक्रम को रोकने के लिए है, तो एक शर्त बुरा है इस्तेमाल होता है;)

+1

लेकिन first_time = 0 असाइनमेंट पर पहुंच गया कभी नहीं किया जा सकता। - प्रयोज्य-कोड का उद्देश्य क्या है, अगर यह इस तरह के अपर्याप्त कोड के लिए कोई चेतावनी नहीं उठाता है? –

+2

इसके अलावा आपका उदाहरण अलग है। Argc के मान के आधार पर आपका "कई कोड" पहुंचा जा सकता है। –

0

जीसीसी गुजरता के दर्जनों है - उनकी तरह स्विच के साथ संकलन की कोशिश को देखने के लिए

-da -dAp -Wa, -एक -fdump-IPA-सब-सब -fdump-वृक्ष की सभी सब -fdump-rtl-सब-सब

मेरा अनुमान है कि कुछ पास मृत किया है प्रश्न में चेतावनी जारी करने के लिए नामित पास से पहले -कोड उन्मूलन। जिसे उचित रूप से एक बग माना जा सकता है, लेकिन संभावना है कि जीसीसी टीम नैतिक प्रतिबद्धता की तुलना में चेतावनी को अधिक सुविधा के रूप में मानती है, और इसे सटीक और पूर्ण बनाने के लिए बहुत से काम करने के लिए प्रेरित नहीं है। यदि आप योगदान देना चाहते हैं, तो आप ऑप्टिमाइज़ेशन को एक-एक करके पास कर सकते हैं जब तक आपको चेतावनी को रोकने में कोई न हो, फिर समस्या को दस्तावेज करने वाली बग रिपोर्ट दर्ज करें। यदि यह आपके समय के लायक नहीं है, तो शायद इसे ठीक करना उनके समय के लायक नहीं है। :-)

15

जीसीसी 4.4 आपको चेतावनी देगा। जीसीसी के बाद के संस्करणों में इस सुविधा (Wunreachable-code) को हटा दिया गया है।

यहाँ देखें: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

+6

मुझे इससे नफरत है जब वे इस तरह के कारणों के आधार पर सुविधाओं को हटाते हैं। और इसे गुप्त रूप से कर रहा है ... * "कंपाइलर अभी भी कमांड लाइन विकल्प को स्वीकार करता है और अनदेखा करता है" * तो एक कंपाइलर अपडेट के बाद हमारे पास एक बग था, अगर संकलक ने चेतावनी दी थी तो इससे बचा जा सकता था ... – Calmarius

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

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