2010-08-01 19 views
12

कंपेलरों के लिए switch to warn when code is unreachable प्रदान करना आम बात है। मैंने कुछ पुस्तकालयों के लिए मैक्रोज़ भी देखे हैं, जो assertions for unreachable code प्रदान करते हैं।जीसीसी को संकेत कैसे दें कि एक लाइन पहुंच योग्य नहीं होनी चाहिए?

वहाँ इस तरह के एक pragma के माध्यम से के रूप में एक संकेत है, या builtin है कि मैं, जीसीसी (या उस बात के लिए किसी अन्य compilers) को पारित कर सकते हैं कि चेतावनी दी है या संकलन के दौरान त्रुटि करेगा कि क्या यह है कि एक लाइन की उम्मीद होने के लिए निर्धारित है पहुंचने योग्य वास्तव में पहुंचा जा सकता है?

if (!conf->devpath) { 
     conf->devpath = arg; 
     return 0; 
    } // pass other opts into fuse 
    else { 
     return 1; 
    } 
    UNREACHABLE_LINE(); 

इस का मूल्य का पता लगाने में, उम्मीद नहीं पहुंचा जा सकता रेखा से ऊपर शर्तों में परिवर्तन के बाद, कि लाइन तथ्य से पहुंचा जा सकता है है:

यहाँ एक उदाहरण है।

उत्तर

14

जीसीसी 4.5, __builtin_unreachable() संकलक इनलाइन का समर्थन करता है -Wunreachable-code के साथ इस संयोजन तुम क्या चाहते हो सकता है, लेकिन शायद नकली चेतावनी

+2

मैं यह नोट करना चाहता हूं कि '-उनरेच करने योग्य-कोड' विकल्प जीसीसी के बाद के संस्करणों में हटा दिया गया था (क्योंकि यह विभिन्न अनुकूलन विकल्पों के तहत अत्यधिक अप्रत्याशित था) – Hasturkun

2

यदि आपके कंपाइलर में आपको आवश्यक चेतावनी नहीं है, तो इसे एक स्थिर विश्लेषक के साथ पूरक किया जा सकता है। जिस प्रकार के विश्लेषक के बारे में मैं बात कर रहा हूं, उसकी अपनी एनोटेशन भाषा होगी और/या सी assert पहचानें, और इन्हें गुणों के संकेतों के लिए उपयोग करें जो निष्पादन के विशिष्ट बिंदुओं पर सत्य होना चाहिए। यदि पहुंचने योग्य बयानों के लिए कोई विशिष्ट टिप्पणी नहीं है, तो आप शायद assert (false); का उपयोग कर सकते हैं।

मैं व्यक्तिगत रूप से उनसे परिचित नहीं हूं लेकिन क्लोकवर्क और कोडसोनर दो प्रसिद्ध विश्लेषक हैं। गोवा तीसरा है।

+2

पुराना 'लिंट' उपकरण टिप्पणी '/ * नोट्रेच */'की अनुमति देने के लिए उपयोग किया जाता है, जो कोड को इंगित करेगा जो पहुंच योग्य नहीं होना चाहिए ... सुनिश्चित नहीं है कि उस टिप्पणी का सामना करने के दौरान उपकरण का व्यवहार क्या था। –

1

जीसीसी 4.4.0 PowerPC करने के लिए Windows पार संकलक -O2 या -O3 साथ संकलन के साथ कारण होगा मेरे लिए काम करता है निम्नलिखित:

#define unreachable asm("unreachable\n")

कोडांतरक अज्ञात संचालन के साथ विफल रहता है संकलक इसे दूर अनुकूलन नहीं करता है क्योंकि यह निष्कर्ष निकाला है कि यह पहुंच से बाहर है।

हां, यह संभवतः 'अनुकूलन विकल्पों के तहत अत्यधिक अप्रत्याशित' है, और जब मैं अंततः संकलक को अद्यतन करता हूं तो तोड़ने की संभावना है, लेकिन इस पल के लिए यह बेहतर नहीं है।