gets
असुरक्षित है क्योंकि आप इसे एक बफर देते हैं, लेकिन आप यह नहीं बताते कि बफर कितना बड़ा है। इनपुट बफर के अंत से पहले लिख सकता है, जो आपके कार्यक्रम को काफी शानदार तरीके से उड़ा सकता है। fgets
उपयोग करने के बजाय एक सा बेहतर है क्योंकि आप यह कहना कितना बड़ा बफर है इस तरह, यह है:
const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];
fgets(buffer, bufsize, stdin);
... इसलिए प्रदान की आप इसे सही जानकारी देते हैं, यह बफर के अंत अतीत बारे में नहीं है और चीजों को उड़ाना।
थोड़ा OT, लेकिन:
आप बफर आकार के लिए एक const int
उपयोग करने के लिए नहीं है, लेकिन मैं करूंगा दृढ़ता से सुझाव है कि आप सिर्फ दोनों स्थानों में एक शाब्दिक संख्या डाल नहीं है, क्योंकि अनिवार्य रूप से आप एक बदल जाएगा लेकिन बाद में नहीं। कंपाइलर मदद कर सकता है:
char buffer[4096];
fgets(buffer, (sizeof buffer/sizeof buffer[0]), stdin);
वह अभिव्यक्ति संकलित समय पर संकलित हो जाती है, रनटाइम नहीं। यह टाइप करने के लिए एक दर्द है, तो मैं हेडर की मेरी हमेशा की तरह सेट में मैक्रो का उपयोग करने के लिए इस्तेमाल:
#define ARRAYCOUNT(a) (sizeof a/sizeof a[0])
... लेकिन मैं अपने शुद्ध सी के साथ पुराने हो चुके कुछ साल कर रहा हूँ, वहाँ शायद एक बेहतर तरीका है इन दिनों।
स्रोत
2010-06-04 12:20:54
यह एक असुरक्षित कार्य है; बफर ओवरफ्लो हमलों को जारी किया जा सकता है यदि कार्यक्रम ऐसे कार्यों का उपयोग करते हैं जो बफर आकार – INS
की जांच करने की संभावना प्रदान नहीं करते हैं, तो अगर मैं काम करता है() के बजाय scanf() का उपयोग करता हूं, लेकिन मुझे कीबोर्ड और प्रोग्राम से 2 इनपुट पढ़ना होगा मैंने पहली बार पढ़ा है के बाद बंद हो जाता है। क्यूं कर? यह कोड है: चार उपयोगकर्ता; चार पास; printf ("Iser ID"); स्कैनफ़ ("% s", उपयोगकर्ता); printf ("पिन कोड:"); स्कैनफ ("% s", पास); – Peiska
@peiska: कार्यक्रम पहले के बाद बंद हो जाता है क्योंकि यह आपके लिए दूसरा स्थान दर्ज करने का इंतजार कर रहा है। आप स्वयं उस दूसरे 'स्कैनएफ' को वहां डाल देते हैं। यह आपको आश्चर्य क्यों करता है कि कार्यक्रम "बंद हो जाता है"? – AnT