2015-03-17 6 views
5

C99 एक समारोह पैरामीटर (केवल समारोह परिभाषा सार्थक, नहीं घोषणा) में static जोड़ा गया है:संकलन समय पर [स्थिर एन] लागू क्यों नहीं किया जाता है?

void func(int a[static 10]) 
{ 
    if (a == NULL) 
     { /* this branch can be optimized out */ } 

    printf("%d", a[-1]); /* causes UB */ 
} 

हालांकि, इसका अर्थ एक अर्थ के रूप में सी 11 6.7.6.3/7 में परिभाषित किया गया है, न कि एक बाधा, जिसका अर्थ यह है कि यदि फ़ंक्शन को गलत तरीके से बुलाया जाता है तो संकलक को डायग्नोस्टिक जारी नहीं करना चाहिए। वास्तव में संकलक निरस्त संकलन नहीं होना चाहिए जबतक कि यह साबित न हो कि सभी शाखाओं में यूबी का कारण बनता है। उदाहरण के लिए:

int main() 
{ 
    func(NULL); // UB 

    int b[9]; 
    func(b);  // UB 
} 

मानक ने इसे बाधा क्यों नहीं बनाया (इसलिए निदान की आवश्यकता है)?

माध्यमिक प्रश्न: फ़ंक्शन हस्ताक्षर का हिस्सा होने के बजाय प्रोटोटाइप (6.7.6.3/13) में static क्यों अनदेखा किया गया है? यह प्रोटोटाइप को शामिल करने की अनुमति देने के लिए भ्रामक लगता है लेकिन फ़ंक्शन बॉडी नहीं करता है, और इसके विपरीत।

+1

'int * p = create_array(); func (पी); 'आप इसका निदान कैसे करते हैं? –

+2

q2 के रूप में, सरणी घोषणाकर्ता में 'स्थिर 'भंडारण-श्रेणी विनिर्देशक नहीं है, इसलिए 6.7.6.3/13 लागू नहीं होता है। सी एफ 6.7.6.3/2 - "पैरामीटर घोषणा में होने वाला एकमात्र स्टोरेज-क्लास विनिर्देशक 'रजिस्टर' है।" –

+0

@ टीटी पुनः। q2: ठीक है, तो क्या इसका मतलब यह प्रोटोटाइप में वास्तव में महत्वपूर्ण है? –

उत्तर

5

क्योंकि सभी मामलों में संकलन समय पर उल्लंघनों का पता नहीं लगाया जा सकता है।

उदाहरण के लिए, तर्क malloc() के साथ आवंटित सरणी के प्रारंभिक तत्व के लिए सूचक हो सकता है। संकलक सामान्य रूप से यह निर्धारित नहीं कर सकता कि सरणी कितनी बड़ी है। न ही, अगर तर्क एक सूचक वस्तु है, तो क्या संकलक सामान्य रूप से पता लगा सकता है कि यह शून्य है या नहीं।

इस सुविधा का मुख्य उद्देश्य कॉल पर प्रतिबंध लागू करना नहीं है, बल्कि अनुकूलन सक्षम करना है। संकलक मान सकता है कि पैरामीटर निर्दिष्ट लंबाई की सरणी के प्रारंभिक तत्व को इंगित करता है। कुछ मामलों में, यह बेहतर कोड पीढ़ी को सक्षम कर सकता है।

लेकिन संकलक निश्चित रूप से उन मामलों के लिए गैर-घातक चेतावनियां जारी कर सकते हैं जिन्हें वे पहचान सकते हैं। मानक में कोई निहितार्थ नहीं है कि ऐसी चेतावनियां जारी नहीं की जानी चाहिए।

+0

बस कुछ स्पष्ट मामलों के लिए यह पता चला कि क्लैंग 4.1 [चेतावनी जारी करता है] (http://hamberg.no/erlend/posts/2013-02-18-static-array-indices.html) –

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