2012-01-24 14 views
7

के साथ AIX पर शून्य पॉइंटर्स को संभालना हमारे पास सी में लिखा गया कोड है जो कभी-कभी शून्य पॉइंटर्स को बहुत अच्छी तरह से संभाल नहीं करता है।जीसीसी सी

कोड मूल रूप से सोलार्स पर लिखा गया था और ऐसे पॉइंटर्स सेगमेंटेशन गलती होती है। आदर्श नहीं है लेकिन खेती से बेहतर है।

हमारा अनुभव है कि यदि आप AIX पर एक नल पॉइंटर से पढ़ा आप 0. मिल आप आप इन संकेत जाल के लिए एक विकल्प -qcheck=all जोड़ सकते हैं XLC संकलक का उपयोग करते हैं है। लेकिन हम जीसीसी का उपयोग करते हैं (और उस कंपाइलर का उपयोग करना जारी रखना चाहते हैं)। जीसीसी ऐसा विकल्प प्रदान करता है?

+1

"शून्य पॉइंटर्स को बहुत अच्छी तरह से संभाल नहीं करते" का क्या मतलब है? –

+3

व्यक्तिगत रूप से मैं नल (जो तकनीकी रूप से '0') के सभी संदर्भों को बग के रूप में मानता है, और संकलक को मुझ पर विश्वास करने के बजाय उसमें जांच करने के लिए कोड जोड़ देगा। विशेष रूप से जब संकलक को पता नहीं होता कि मैं क्या करना चाहता हूं यदि कोई 'शून्य' सूचक है? कभी-कभी पॉइंटर तक पहुंचने वाले कोड को छोड़ना ठीक है, कभी-कभी यह एक घातक त्रुटि होती है जिसे प्रोग्राम को निरस्त करने की आवश्यकता होती है। –

+1

AFAIK एक पूर्ण सूचक का अपरिवर्तनीय अपरिभाषित व्यवहार की ओर जाता है। –

उत्तर

6

क्या जीसीसी ऐसा विकल्प प्रदान करता है?

मैं भेड़िये से जवाब नहीं कर रहा हूं, यह नहीं है। हालांकि मैं gcc और runtime NULL चेक के बारे में जानकारी के अनुपस्थिति उद्धृत नहीं कर सकता।

जिस समस्या का आप सामना कर रहे हैं वह यह है कि आप एक ऐसे कार्यक्रम में थोड़ा और परिभाषित अपरिभाषित व्यवहार करने की कोशिश कर रहे हैं जो खराब लिखा गया है।

मैं अनुशंसा करता हूं कि आप बुलेट काट लें और या तो xlc पर स्विच करें या मैन्युअल रूप से NULL कोड को चेक करें जब तक कि खराब व्यवहार नहीं मिला और हटा दिया गया हो।

पर विचार करें:

  • एक सूचक
  • जोड़ा जा रहा है कि सूचक कार्य
  • के बाद मैक्रो जोड़ा जा रहा है शून्य-जाँच करने के लिए एक मैक्रो बनाना कि कार्यों कि संकेत
स्वीकार की प्रवेश बिंदु करने के लिए मैक्रो

जैसे ही बग हटा दिए जाते हैं, आप इन चेक को निकालना शुरू कर सकते हैं।

2
  1. कृपया हमें सभी एक पक्ष दें और उचित कोड NULL अपने कोड में चेक करें। संकलक हर जगह पर प्रदर्शन करने के बजाय, केवल NULL की जांच करके प्रदर्शन में थोड़ा सा लाभ प्राप्त करेगा, लेकिन आपका कोड अन्य प्लेटफ़ॉर्म पर अधिक पोर्टेबल होगा।

    और चलिए इस तथ्य का जिक्र नहीं करते हैं कि कंपाइलर को कुछ अचूक स्टैक डंप/स्रोत कोड स्थान/त्रुटि कोड ड्रॉप करने की बजाय उचित त्रुटि संदेश मुद्रित करने की अधिक संभावना होगी जो आपके उपयोगकर्ताओं की सहायता नहीं करेगा।

  2. एआईक्स एक पूर्ण पृष्ठ की अवधारणा का उपयोग करता है। अनिवार्य रूप से, NULL (यानी आभासी पता 0x0) उस स्थान पर मैप किया गया है जिसमें शून्य का पूरा समूह शामिल है। यह स्ट्रिंग मैनिपुलेशन कोड e.t.c. की अनुमति देता है NULL पॉइंटर का सामना करने के बावजूद जारी रखने के लिए।

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

  3. जहां तक ​​मुझे पता है, जीसीसी के पास मौलिक रूप से टूटे हुए कोड के आसपास काम करने के लिए कोई विकल्प नहीं है। यहां तक ​​कि ऐतिहासिक रूप से समर्थित पैटर्न, जैसे लिखने योग्य स्ट्रिंग अक्षर, नए जीसीसी संस्करणों में धीरे-धीरे चरणबद्ध हो गए हैं।

    -fmudflap जैसे मेमोरी डीबगिंग विकल्पों का उपयोग करते समय कुछ समर्थन हो सकता है, लेकिन मुझे वास्तव में पता नहीं है - किसी भी मामले में आपको उत्पादन प्रणालियों में डिबगिंग कोड का उपयोग नहीं करना चाहिए, विशेष रूप से टूटी हुई कोड को काम करने के लिए मजबूर करना।

निष्कर्ष: किसी मुझे नहीं लगता है कि आप स्पष्ट NULL चेकों जोड़ने से बचें कर सकते हैं।

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

दुर्भाग्य से, AIX के लिए कोई Valgrind समर्थन नहीं है। यदि आपके पास नकदी है, तो आप एईक्स के लिए आईबीएम तर्कसंगत शुद्धता प्लस को देखना चाहेंगे - इसमें ऐसी त्रुटियां हो सकती हैं।

परीक्षण प्रणाली पर xlc और अन्य सभी चीज़ों के लिए gcc का उपयोग करना भी संभव हो सकता है, लेकिन दुर्भाग्य से वे पूरी तरह से संगत नहीं हैं।

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

  • कोई संबंधित समस्या नहीं^_^