मैं निम्नलिखित सी कोड टुकड़ा है और त्रुटि की पहचान करनी है और इसे और अधिक सुरक्षित रूप से लेखन का एक तरीका सुझाव देते हैं:यह सी टुकड़ा कैसे अधिक सुरक्षित रूप से लिखा जा सकता है?
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
तो त्रुटि है कि strlen एक स्ट्रिंग के अनुगामी '\0'
पर ध्यान नहीं देता है और इसलिए यह नहीं है प्रतिलिपि के लिए पर्याप्त स्मृति आवंटित करने जा रहा है, लेकिन मुझे यकीन नहीं है कि वे इसे और अधिक सुरक्षित रूप से लिखने के बारे में क्या प्राप्त कर रहे हैं?
मैं केवल malloc(strlen(somestring)+1))
का उपयोग कर सकता हूं, लेकिन मुझे लगता है कि इससे बेहतर तरीका होना चाहिए?
संपादित करें: ठीक है, मैं एक जवाब स्वीकार कर लिया है, मुझे लगता है कि strdup समाधान हम से उम्मीद नहीं की जाएगी के रूप में यह एएनएसआई सी का हिस्सा यह काफी एक व्यक्तिपरक सवाल तो मैं हो रहा है नहीं है मुझे यकीन नहीं है कि मैंने जो स्वीकार किया है वह वास्तव में सबसे अच्छा है। वैसे भी सभी उत्तरों के लिए धन्यवाद।
+1 strncpy के उपयोग के लिए। यह इतने सारे सुरक्षा छेद का स्रोत है, यह मजाकिया नहीं है। –
strncpy() का उपयोग करना बुरी तरह से strcpy() का उपयोग करने से भी बदतर है। यदि आप strncpy() का उपयोग करते हैं, तो आप * नहीं * गारंटीकृत शून्य समाप्त आउटपुट (यह उदाहरण ठीक है, लेकिन सामान्य रूप से नहीं)। साथ ही, यदि आप तीसरे पैरामीटर के लिए strncpy() पर ओवर-साइज बफर और आकार (बफर) का उपयोग करते हैं, तो आपके हाथों पर एक प्रदर्शन मिनी-आपदा है; strncpy() प्रतिलिपि डेटा को पूरी लंबाई में शून्य-पैड शून्य-पैड। * हाँ * स्रोत और लक्ष्य तारों की लंबाई जानने के लिए; यदि आप इसे सही तरीके से करते हैं, तो strcpy() का उपयोग करके strncpy() के अंधेरे उपयोग से सुरक्षित और सुरक्षित है। (यदि यह कोई मदद है, तो strncat() बहुत दूर है, strncpy() से कहीं भी बदतर है; इसका कभी भी उपयोग न करें!) –
जोनाथन, strlcpy() बहुत अधिक है। जब भी यह उपलब्ध हो, मैं इसका उपयोग करता हूं, और कभी-कभी मैं एक संस्करण के साथ लाता हूं जब यह नहीं होता है। बहुत बुरा ड्रेपर ऐसा डोर है। – dwc