MISRA-C मानक 2012 में मुझे एक स्पष्ट नियम नहीं मिला जो कहता है कि कार्यान्वयनकर्ता को यह जांचने की आवश्यकता है कि सरणी को सीमा से बाहर सूचकांक के साथ एक्सेस नहीं किया गया है।

तो सूचकांक/सीमाओं से बाहर एक सरणी हो सकती है।

शायद यह कुछ भी नहीं है MISRA-C की परवाह है या शायद मुझे कुछ याद आया?

2
Peter 12 नवम्बर 2020, 12:00

1 उत्तर

सबसे बढ़िया उत्तर

MISRA-C:2012 में सलाहकार नियम 17.5 है जिसके लिए आवश्यक है कि फ़ंक्शन के लिए सरणी पैरामीटर में निर्दिष्ट सीमा होनी चाहिए, ताकि उस फ़ंक्शन के अंदर सरणी की आउट-ऑफ-बाउंड जाँच सक्षम हो सके।

पहले MISRA-C में एक नियम था जो फंक्शन पैरामीटर के लिए पॉइंटर नोटेशन (int*) पर ऐरे सिंटैक्स नोटेशन (int []) के उपयोग का समर्थन करता था, लेकिन यह थोड़ा गुमराह था क्योंकि सभी एरे पैरामीटर समायोजित हो जाते हैं। ("क्षय") किसी भी तरह पहले तत्व को पॉइंटर्स में, इसलिए सरणी सिंटैक्स स्वयं में कुछ भी नहीं जोड़ता है जब तक कि सीमाएं निर्दिष्ट न हों। उस नियम को वर्तमान में सलाहकार नियम 17.5 में फिर से लिखा गया था।

नियम 18.1 (आवश्यक) कहता है कि किसी भी सूचक अंकगणित का परिणाम एक सूचक में होना चाहिए जो मूल ऑपरेंड के समान सरणी पर इंगित करता है। यह (यकीनन) सीमा से बाहर के मामले को भी कवर करने के लिए इस्तेमाल किया जाना चाहिए, क्योंकि arr[i] *(arr+i) के बराबर है और आप वास्तव में सरणी सबस्क्रिप्टिंग [] ऑपरेटर के साथ एक सरणी तक नहीं पहुंच सकते हैं, केवल एक सूचक (देखें क्या पॉइंटर्स "सरणी स्टाइल इंडेक्सिंग" का समर्थन करते हैं?)।

सामान्य नियम 1.3 भी है जिसमें कहा गया है कि कार्यक्रम में किसी भी प्रकार का अपरिभाषित व्यवहार नहीं होना चाहिए, जो यूबी के उन सभी मामलों को कवर करने के लिए है जो अन्य विशिष्ट नियमों द्वारा नियंत्रित नहीं किए जाते हैं।

लेकिन अंत में, यह स्थिर विश्लेषक के लिए कार्यान्वयन की गुणवत्ता का मामला होगा। जब वे सक्षम होते हैं, तो ऐसे अधिकांश उपकरण MISRA-C की परवाह किए बिना, वैसे भी आउट-ऑफ-बाउंड चेक करते हैं।


दुर्भाग्य से, MISRA-C उसी गुमराह विचारों से पीड़ित है, जब VLA-C11 ने VLA को वैकल्पिक बनाया और MISRA-C ने उन्हें पूरी तरह से प्रतिबंधित कर दिया। दोनों समितियां आधुनिक सी प्रोग्रामिंग को ध्यान में रखने में विफल रहीं, जहां आप टाइप सुरक्षा और स्थिर विश्लेषण संभावनाओं को बढ़ाने के लिए वीएलए के लिए सूचक का उपयोग कर सकते हैं, अर्थात्:

void func (size_t n, int arr[n])

यह एक स्थिर विश्लेषक को बताता है कि यह जांच कर सकता है कि func के अंदर arr की पहुंच n से अधिक नहीं है। जबकि (size_t n, int* arr) स्टैक विश्लेषक जैक को नहीं बताता है।

यह रक्षात्मक प्रोग्रामिंग पद्धति जो बेहतर स्थिर विश्लेषण और सुरक्षित कार्यक्रम बनाती है, उसे MISRA-C:2012 द्वारा प्रतिबंधित किया गया है और C11/C17 द्वारा वैकल्पिक बनाया गया है। जबकि आवंटित वीएलए ऑब्जेक्ट हल्के ढंग से उपयोगी होते हैं, वीएलए के पॉइंटर्स आधुनिक सी प्रोग्रामिंग में बहुत उपयोगी होते हैं।

3
Lundin 12 नवम्बर 2020, 09:36