तो यहाँ मेरा मानना है कि मैं एक छोटे से बफर अतिप्रवाह समस्या मैंने पाया जब किसी और के कोड की समीक्षा की है। यह तुरंत मुझे गलत, और संभावित रूप से खतरनाक के रूप में मारा, लेकिन स्वीकार्य रूप से मैं इस "गलती" के वास्तविक परिणामों की व्याख्या नहीं कर सका, यदि कोई हो।इस बफर ओवरफ़्लो के परिणाम?
मैं त्रुटि प्रदर्शित करने के लिए एक परीक्षण एप्लिकेशन को लिखा है, लेकिन (मेरे निराशा) पाया इसे सही ढंग से अतिप्रवाह की परवाह किए बिना चलाने के लिए लगता है कि था। मैं विश्वास करना चाहता हूं कि यह सिर्फ मौका है, लेकिन यह निर्धारित करने के लिए कुछ फीडबैक चाहते थे कि मेरी सोच गलत थी या अगर वास्तव में कोई समस्या है तो यह मेरे टेस्ट ऐप में अपना सिर नहीं दिखा रहा है।
समस्या कोड (मुझे लगता है कि यह है, वैसे भी):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
अब, कारण यह बाहर मेरे लिए खड़ा था और मैं इसे झंडा करना चाहते हैं के रूप में एक संभव बफर अतिप्रवाह पहले strlen
की वजह से है। सूचक अंकगणित के कारण, 'गलत' + 1
की नियुक्ति strlen
26
बजाय 27
वापस जाने के लिए कारण होगा (की लंबाई लेने "अपने स्ट्रिंग 27 वर्ण लंबा है")। sprintf
, मुझे विश्वास है, फिर 27 char को बफर में प्रिंट करता है और एक बफर ओवरफ़्लो का कारण बनता है।
है कि एक सही आकलन है?
मैं जो व्यक्ति कोड मैं देख रहा था है के लिए यह प्रदर्शित करने के लिए एक परीक्षण एप्लिकेशन लिखा था, और पाया कि यहां तक कि डीबगर में स्ट्रिंग सही ढंग से प्रिंट होगा। मैं इस कोड के पहले और बाद में ढेर और ढेर पर अन्य चर डालने का भी प्रयास करता हूं यह देखने के लिए कि क्या मैं स्मृति के पड़ोसी क्षेत्रों को प्रभावित कर सकता हूं, लेकिन अभी भी सही आउटपुट प्राप्त कर रहा था। मुझे एहसास है कि मेरी नई आवंटित ढेर मेमोरी निकट नहीं हो सकती है, जो उपयोगी अतिप्रवाह की कमी की व्याख्या करेगी, लेकिन अगर मैं वास्तव में एक मुद्दा है तो मैं वास्तव में दूसरों की राय के साथ पुष्टि करना चाहता हूं।
चूंकि यह एक बहुत सरल "सवाल", यदि आप संदर्भ के कुछ प्रकार के साथ अपने जवाब के रूप में अच्छी तरह से समर्थन कर अच्छा होगा है। जबकि मैं आपके इनपुट का महत्व और स्वागत करता हूं, मैं अंतिम जवाब के रूप में "हां यह" स्वीकार करने वाला नहीं हूं। अग्रिम में कृपया धन्यवाद।
अद्यतन: अतिरिक्त अंतर्दृष्टि का एक बहुत के साथ कई अच्छे जवाब। दुर्भाग्य से, मैं उन सभी को स्वीकार नहीं कर सकता। अपना ज्ञान साझा करने और मेरी दूसरी राय होने के लिए धन्यवाद। मैं मदद की सराहना करता हूं।
आप पैडिंग/संरेखण के कारण उपरोक्त कोड के साथ काट नहीं सकते हैं। क्या आप अपने प्रयोगों को एक स्ट्रिंग के साथ दोहरा सकते हैं, 64 अक्षरों का कहना है, इसलिए आवंटन 65 वर्ण होने की आवश्यकता होगी? और 'sprintf' से पहले दो ऐसे तार आवंटित करें, उन्हें विभिन्न आदेशों में भरें। –
कच्चे स्ट्रिंग लेने और इसे +1 जोड़ने के लिए यह बहुत बुरा कोड है! मैं केवल उस तथ्य पर कोड समीक्षा को झुका दूंगा। –
और यही कारण है कि हम डेवलपर कई अच्छी तरह से परीक्षण पुस्तकालयों का उपयोग करते हैं जैसे हम कर सकते हैं ... क्योंकि हम इस तरह मूर्खतापूर्ण गलतियां करते हैं! :-) @ जॉन्सन मुझे पूरा यकीन है कि डेवलपर का मतलब लंबाई में 1 जोड़ना था, न कि स्ट्रिंग स्वयं, इसलिए बग। – corsiKa