2013-01-22 9 views
7

शीर्षक के अनुसार, मैं AIX के लिए एक दशक पहले विकसित कुछ विरासत कोड को स्थानांतरित करने की योजना बना रहा हूं। समस्या यह है कि कोड बेस बहुत बड़ा है। डेवलपर्स ने अपने पॉइंटर्स को मूल कोड में प्रारंभ नहीं किया था। अब नवीनतम सर्वर पर कोड माइग्रेट करते समय, मुझे इसके साथ कुछ समस्याएं दिखाई देती हैं।सी ++ कोड माइग्रेशन: अनियमित पॉइंटर्स को संभालना

मुझे पता है कि सबसे अच्छा समाधान सभी कोड के माध्यम से चलाने और आवश्यक सभी चर के लिए शुरू करना है। हालांकि, मैं जानना चाहता हूं कि इस समस्या के लिए कोई अन्य समाधान उपलब्ध है या नहीं। मैंने Google की कोशिश की लेकिन उचित उत्तर नहीं मिला।

+2

क्या आपके कंप्रेसर ने AIX पर उन्हें आपके लिए प्रारंभ किया था? क्या कोड अनियमित स्मृति में मूल्य (ओं) पर निर्भर करता है? यदि उन दोनों का उत्तर "नहीं" है, तो आप नए सर्वर पर कोड को संकलित करने और क्या होता है यह देखने का प्रयास कर सकते हैं। आपका कोड सिद्धांत में बेहद असुरक्षित हो सकता है, लेकिन व्यवहार में यह बस काम कर सकता है। –

+2

"मुझे कोड के साथ कुछ समस्याएं क्या दिखाई देती हैं।" क्या मतलब है? क्या आप वास्तव में असफलताओं को देख रहे हैं, या बस आप यह खोज रहे हैं कि "यह सूचक प्रारंभ नहीं हुआ है, लेकिन शायद यह कोई समस्या नहीं है"? पॉइंटर्स को शुरू करना जो बाद में एक अलग मूल्य पर सेट किए जाते हैं, बिना किसी शर्त के अपने उद्देश्य में कार्य करता है [यह स्पष्ट हो सकता है कि यह निश्चित रूप से कुछ पर सेट है]। –

+1

सबसे अच्छा समाधान सभी पॉइंटर्स को आरंभ करना है। कोई सुरक्षित तरीका नहीं है। – andre

उत्तर

2

सबसे निवारक दीर्घकालिक दृष्टिकोण सभी बिंदुओं को उनके द्वारा घोषित स्थान पर प्रारंभ करना है, जीवनकाल को प्रबंधित करने के लिए उचित स्मार्ट पॉइंटर्स का उपयोग करने के लिए कोड बदलना। यदि आपके पास किसी प्रकार का यूनिट परीक्षण है तो यह रिफैक्टरिंग अपेक्षाकृत दर्द रहित हो सकती है।

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

2

बस सभी चर शुरू करना एक अच्छा विचार नहीं हो सकता है।

विश्वसनीय व्यवहार आम तौर पर सही होने वाले मानों पर निर्भर करता है ("निर्माण द्वारा गारंटीकृत" सही होने के लिए)। अनियमित चर के साथ समस्या यह नहीं है कि उनके पास अज्ञात मान हैं। स्पष्ट रूप से अज्ञात होना एक समस्या है, लेकिन फिर वांछित संत ज्ञात है और मान सही है। किसी ज्ञात मान को एक वैरिएबल प्रारंभ करना जो सही नहीं है, विश्वसनीय व्यवहार उत्पन्न नहीं करता है।

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

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


संकेत के साथ डिफ़ॉल्ट मान आम तौर पर nullptr, जो कुछ हद तक ऊपर क्योंकि एक अशक्त सूचक dereferencing आम तौर पर एक तत्काल दुर्घटना (डिबगिंग के लिए अच्छा) पैदा करता है पर चर्चा की प्रथम अंक से बचा जाता है है। हालांकि कोड एक नल पॉइंटर का पता लगा सकता है और एक त्रुटि (डीबगिंग के लिए अच्छा) की रिपोर्ट कर सकता है या किसी अन्य विधि (डीबगिंग के लिए खराब) पर वापस आ सकता है। आप प्रारंभिक पॉइंटर्स के उपयोग को पहचानने के बजाय स्थिर विश्लेषण का उपयोग करके बेहतर हो सकते हैं। हालांकि स्थैतिक विश्लेषण शून्य पॉइंटर्स के डीरफ्रेंसिंग का पता लगा सकता है, लेकिन यह पता नहीं लगाएगा कि शून्य पॉइंटर्स त्रुटि रिपोर्टिंग या फ़ॉलबैक दिनचर्या का उपयोग क्यों करते हैं।


अपनी टिप्पणी के जवाब में:

प्रमुख समस्याओं कि मैं देख स्थानीय चर को

  • प्वाइंटर कार्यों से लौटाए जाते हैं कर रहे हैं।
  • लगभग सभी सूचक चर प्रारंभ नहीं किए जाते हैं। मुझे यकीन है कि एईक्स पहले के प्लेटफॉर्म में ग्राहक के लिए यह सुविधा प्रदान करता है, हालांकि मुझे सच में संदेह है कि कोड वास्तविक परीक्षण (उत्पादन) में होने पर लिनक्स में बेकार ढंग से चल रहा है।
  • मैं आंशिक समाधान प्रदान नहीं कर सकता जो काम कर सकता है। मैं अपने ग्राहक को सर्वश्रेष्ठ देना पसंद करता हूं जो मुझे मेरे काम के लिए भुगतान करता है। तो वर्कअराउंड का उपयोग करना पसंद नहीं करेंगे।
  • गुणवत्ता से समझौता नहीं किया जा सकता है।
  • उन्हें ठीक (और विशेष ध्यान देना सही ढंग से सफाई करने के लिए)
  • मैं बस एक प्रारंभकर्ता कमी से ऊपर का तर्क के रूप में में नहीं है और स्वयं का एक दोष। यदि केवल प्रारंभिक मूल्य वास्तव में अवैध तरीके से उपयोग किया जाता है तो केवल एक दोष होता है। मुझे यकीन नहीं है कि एईक्स आराम प्रदान करने के बारे में आपका क्या मतलब है।
  • जैसा कि मैंने 'आंशिक समाधान' और 'वर्कअराउंड' से ऊपर तर्क दिया है, अंधेरे से सबकुछ शुरू करना होगा।
  • फिर, अंधेरे से सबकुछ शुरू करने से न केवल बेकार काम हो सकता है, बल्कि यह वास्तव में बग का पता लगाने के लिए कुछ टूल ले कर गुणवत्ता समझौता कर सकता है।
+0

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

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