C++ टेम्पलेट का उपयोग अंतरिक्ष/विकिरण वाले वातावरण में अनुशंसित क्यों नहीं है?




embedded fault-tolerance (2)

इस प्रश्न को पढ़कर, मैंने समझा, उदाहरण के लिए, उन वातावरणों में गतिशील आवंटन या अपवाद की सिफारिश क्यों नहीं की जाती है, जहां विकिरण अधिक है, जैसे अंतरिक्ष में या परमाणु ऊर्जा संयंत्र में। टेम्प्लेटिंग टेम्प्लेट, मैं क्यों नहीं देखता। क्या आप इसे मुझे समझा सकते हैं?

इस जवाब पर विचार करते हुए, यह कहता है कि यह उपयोग करने के लिए काफी सुरक्षित है।

नोट: मैं जटिल मानक पुस्तकालय सामग्री के बारे में बात नहीं कर रहा हूं, लेकिन उद्देश्य-निर्मित कस्टम टेम्पलेट।


अंतरिक्ष / विकिरणित वातावरण में C ++ टेम्प्लेट के उपयोग की अनुशंसा क्यों नहीं की जाती है?

यह सिफारिश MISRA C कोडिंग नियमों की और C ++ नियमों की, और DO178C सिफारिशों की , C ++ के लिए एक सामान्यीकरण है , और यह विकिरण से संबंधित नहीं है, बल्कि एम्बेडेड सिस्टम से संबंधित है। विकिरण और कंपन की कमी के कारण, किसी भी स्पेस रॉकेट कंप्यूटर का एम्बेडेड हार्डवेयर बहुत छोटा होना चाहिए (उदाहरण के लिए किफायती और ऊर्जा-खपत कारणों से, यह कंप्यूटर में अधिक शक्ति है- एक रास्पबेरी पाई-जैसा सिस्टम एक बड़ा x86 सर्वर सिस्टम से )। अंतरिक्ष कठोर चिप्स की कीमत उनके नागरिक समकक्षों के रूप में 1000 गुना ज्यादा है। और स्पेस-एम्बेडेड कंप्यूटरों पर WCET गणना करना अभी भी एक तकनीकी चुनौती है (उदाहरण के लिए सीपीयू कैश संबंधित मुद्दों के कारण)। इसलिए, ढेर आवंटन safety-critical एम्बेडेड सॉफ़्टवेयर-सघन प्रणालियों पर आधारित है (आप इनमें से पुरानी स्थितियों को कैसे संभालेंगे? या आप कैसे साबित करेंगे कि आपके पास सभी वास्तविक समय के मामलों के लिए पर्याप्त रैम है?)

CompCert Frama-Clang CompCert और CompCert में भी देखें और निम्नलिखित देखें:

  • C ++ 11 (या निम्नलिखित) एक बहुत ही जटिल प्रोग्रामिंग भाषा है । इसका कोई पूर्ण औपचारिक शब्दार्थ नहीं है । सी ++ में पर्याप्त विशेषज्ञ दुनिया भर में केवल कुछ दर्जनों हैं (शायद, उनमें से ज्यादातर इसकी मानक समिति में हैं)। मैं C ++ में कोडिंग करने में सक्षम हूं, लेकिन मूव शब्दार्थ या C ++ मेमोरी मॉडल के सभी सूक्ष्म कोने के मामलों की व्याख्या नहीं कर रहा हूं। इसके अलावा, C ++ को व्यवहारिक रूप से उपयोग किए जाने वाले कई अनुकूलन की आवश्यकता होती है।

  • विशेष रूप से एक त्रुटि-मुक्त सी ++ संकलक बनाना बहुत मुश्किल है , क्योंकि सी ++ को व्यावहारिक रूप से मुश्किल optimizations आवश्यकता होती optimizations , और सी ++ विनिर्देशन की जटिलता के कारण। लेकिन वर्तमान वाले (जैसे हाल के जीसीसी या क्लैंग) व्यवहार में काफी अच्छे हैं, और उनके पास कुछ (लेकिन अभी भी कुछ) अवशिष्ट संकलक कीड़े हैं। C ++ के लिए अभी तक कोई CompCert ++ नहीं है, और एक बनाने के लिए कई लाखों € या US $ की आवश्यकता होती है (लेकिन अगर आप इस तरह की राशि एकत्र कर सकते हैं, तो कृपया me ईमेल से संपर्क करें, जैसे [email protected] , मेरे काम के ईमेल पर) )। और अंतरिक्ष सॉफ्टवेयर उद्योग बेहद रूढ़िवादी है।

  • एक अच्छा C या C ++ हीप मेमोरी एलोकेटर बनाना मुश्किल है । एक कोडिंग व्यापार-नापसंद का मामला है। एक मजाक के रूप में, इस सी ढेर आवंटन को सी ++ में बदलने पर विचार करें ।

  • टेम्प्लेट से संबंधित C ++ कोड की सुरक्षा गुणों (विशेष रूप से, दौड़ की स्थिति या अपरिभाषित व्यवहार जैसे कि बफर ओवरफ़्लो का अभाव) को साबित करना , अभी भी 2Q2019 में, C ++ कोड के स्थिर प्रोग्राम विश्लेषण की कला की स्थिति से थोड़ा आगे है । मेरा मसौदा बिस्मोन तकनीकी रिपोर्ट (यह एक प्रारूप H2020 है, इसलिए कृपया यूरोपीय नौकरशाहों के लिए पृष्ठों को छोड़ दें) में कई पृष्ठ हैं जो इसे और अधिक विवरण में समझाते हैं। चावल की प्रमेय से अवगत रहें।

  • संपूर्ण सिस्टम C ++ एम्बेडेड सॉफ़्टवेयर परीक्षण के लिए एक रॉकेट लॉन्च (एक ला एरिएन 5 परीक्षण उड़ान 501 , या प्रयोगशाला में कम से कम जटिल और भारी प्रयोग) की आवश्यकता हो सकती है। यह बहुत महंगा है । यहां तक ​​कि परीक्षण, पृथ्वी पर, एक मंगल रोवर बहुत पैसा लेता है।

इसके बारे में सोचो: आप कुछ सुरक्षा-महत्वपूर्ण एम्बेडेड सॉफ़्टवेयर (जैसे ट्रेन ब्रेकिंग, स्वायत्त वाहन, स्वायत्त ड्रोन, बड़ा तेल मंच या तेल रिफाइनरी, मिसाइल, आदि ...) को कोड कर रहे हैं। आप भोलेपन से कुछ C ++ मानक कंटेनर का उपयोग करते हैं, जैसे कुछ std::map<std::string,long> । स्मृति स्थितियों से बाहर के लिए क्या होना चाहिए? आप 100 मीटर € स्पेस रॉकेट की फंडिंग करने वाले संगठनों में "साबित" या कम से कम "कायल" कैसे कर सकते हैं, कि आपका एम्बेडेड सॉफ्टवेयर (इसे बनाने के लिए इस्तेमाल किया गया कंपाइलर सहित) काफी अच्छा है? एक दशक पुराना नियम किसी भी प्रकार के गतिशील ढेर आवंटन के लिए मना था।

मैं जटिल मानक पुस्तकालय सामानों के बारे में बात नहीं कर रहा हूँ, लेकिन कस्टम-निर्मित कस्टम टेम्पलेट।

यहां तक ​​कि ये साबित करना मुश्किल है , या आमतौर पर उनकी गुणवत्ता का आकलन करने के लिए (और आप शायद उनके अंदर अपने स्वयं के allocator का उपयोग करना चाहते हैं)। अंतरिक्ष में, कोड स्थान एक मजबूत बाधा है। इसलिए, आप उदाहरण के लिए, g++ -Os -Wall या g++ -Os -Wall साथ संकलन करेंगे। लेकिन आपने कैसे साबित किया कि -Os परीक्षण के द्वारा -Os सूक्ष्मतर अनुकूलन (और ये आपके जीसीसी या -Os संस्करण के लिए विशिष्ट हैं)? आपका स्पेस फ़ंडिंग संगठन आपसे यह पूछेगा कि, एम्बेडेड C ++ स्पेस सॉफ़्टवेयर में कोई भी रन-टाइम बग मिशन को क्रैश कर सकता है ( एरियन 5 पहली उड़ान विफलता के बारे में फिर से पढ़े - अडा की कुछ बोली में कोडित किया गया था जो उस समय एक "बेहतर" था। "सुरक्षित" प्रकार की प्रणाली C ++ 17 की तुलना में आज), लेकिन यूरोपीय लोगों पर बहुत हंसी नहीं करते हैं। अपने MACS साथ बोइंग 737 मैक्स एक समान गड़बड़ है )।

मेरी व्यक्तिगत सिफारिश (लेकिन कृपया इसे बहुत गंभीरता से न लें। 2019 में यह कुछ और की तुलना में अधिक दंड है) रूस्त में आपके अंतरिक्ष एम्बेडेड सॉफ़्टवेयर को कोड करने पर विचार करना होगा। क्योंकि यह C ++ से थोड़ा अधिक सुरक्षित है। बेशक, आपको 5 से 7 साल में 5 से 10 M € (या मूसा $) खर्च करने होंगे, एक ठीक जंग संकलक पाने के लिए, अंतरिक्ष कंप्यूटर के लिए उपयुक्त (फिर से, कृपया मुझे पेशेवर रूप से संपर्क करें, अगर आप खर्च करने में सक्षम हैं एक मुफ्त सॉफ्टवेयर पर बहुत संकलक / संकलक की तरह जंग)। लेकिन यह सिर्फ सॉफ्टवेयर इंजीनियरिंग और सॉफ्टवेयर परियोजना के प्रबंधन की बात है (अधिक के लिए पौराणिक मानव-महीना और बकवास दोनों नौकरियों को पढ़ें, दिलबर्ट सिद्धांत के बारे में भी जागरूक रहें : यह अंतरिक्ष सॉफ्टवेयर उद्योग, या एम्बेडेड कंपाइलर उद्योग पर उतना ही लागू होता है, जितना कि और कुछ)।

मेरी मजबूत और व्यक्तिगत राय है कि यूरोपीय आयोग को फंड करना चाहिए (उदाहरण के लिए क्षितिज यूरोप के माध्यम से) एक मुफ्त सॉफ्टवेयर CompCert ++ (या इससे भी बेहतर, एक Compcert / Rust) परियोजना की तरह (और ऐसी परियोजना के लिए 5 वर्ष से अधिक और 5 से अधिक शीर्ष की आवश्यकता होगी -क्लास, पीएचडी शोधकर्ता)। लेकिन, 60 साल की उम्र में, मुझे दुख है कि पता है कि ऐसा होने वाला नहीं है (क्योंकि चुनाव आयोग की विचारधारा स्पष्ट कारणों से जर्मन नीतियों से प्रेरित है- अभी भी इतिहास के अंत का भ्रम है, इसलिए H2020 और क्षितिज यूरोप है,) अभ्यास, ज्यादातर यूरोपीय टैक्स हैवन के माध्यम से यूरोप में निगमों के लिए कर अनुकूलन को लागू करने का एक तरीका है), और यह कि CompCert परियोजना के कई सदस्यों के साथ कई निजी चर्चाओं के बाद। मैं दुख की बात है कि DARPA या NASA को भविष्य के कुछ CompCert / Rust प्रोजेक्ट (EC धन की तुलना में) की फंडिंग की अधिक संभावना है।

एनबी। यूरोपीय एवियोनिक्स उद्योग (ज्यादातर एयरबस) अधिक औपचारिक तरीकों का उपयोग कर रहा है जो उत्तरी अमेरिकी एक (बोइंग) के पास है। इसलिए कुछ (सभी नहीं) इकाई परीक्षणों को टाला जाता है (चूंकि स्रोत कोड के औपचारिक साक्ष्य द्वारा प्रतिस्थापित किया जाता है, शायद Frama-C या Frama-C जैसे उपकरणों के साथ - न ही सी ++ के लिए प्रमाणित किया गया है, केवल सी के एक सबसेट के लिए सी गतिशील डायनेमिक आवंटन और कई C की अन्य विशेषताएं)। और यह DO178C (पूर्ववर्ती DO-178B DO178C DO-178B द्वारा नहीं) और फ्रेंच नियामक, DGAC (और मुझे अन्य यूरोपीय नियामकों द्वारा अनुमान है) द्वारा अनुमोदित है।


सुरक्षा कोड में टेम्पलेट्स के उपयोग के खिलाफ तर्क यह है कि उन्हें वास्तविक लाभ के बिना आपके कोड की जटिलता को बढ़ाने के लिए माना जाता है। यदि आपके पास खराब टूलींग और सुरक्षा का उत्कृष्ट विचार है तो यह तर्क मान्य है। निम्नलिखित उदाहरण लें:

template<class T>  fun(T t){
   do_some_thing(t);
}

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

दूसरी समस्या यह है कि एक:

fun(b);

यह रेखा स्व-निहित रेखा नहीं है। आपको यह जानने के लिए बी के प्रकार को देखने की जरूरत है कि वास्तव में किस फ़ंक्शन को कहा जाता है। उचित टूलींग जो समझती है कि टेम्पलेट्स यहाँ मदद करती हैं। लेकिन इस मामले में यह सच है कि यह कोड को मैन्युअल रूप से जांचना कठिन बनाता है।





fault-tolerance