2010-12-11 19 views
37

मैं चेतावनी है कि मैं कोड की इस पंक्ति पर मिलता निकालना चाहते हैं,चेतावनी: प्रारूप नहीं एक स्ट्रिंग शाब्दिक और कोई प्रारूप तर्क

FILE *fil; 
char *imp; 
(...) 
fprintf(fil,imp); 

बात है जब मैं यह कर यह फ़ाइल पर लिखता है वास्तव में मैं क्या चाहते हैं, लेकिन अगर मैं इस

fprintf(fil, "%s", imp); 
+0

क्या 'शामिल imp' करता है? – casablanca

+1

क्या होता है यदि आप 'fputs (imp, fil) के साथ fprintf को प्रतिस्थापित करते हैं; '? – pmg

+0

एक स्ट्रिंग, मान लें कि इस आईपी = "टेस्ट" की तरह कुछ; – Unzi

उत्तर

43

यह चेतावनी जीसीसी आपको यह बताने का तरीका है कि यह printf शैली फ़ंक्शन (printf, fprintf ... आदि) में प्रारूप स्ट्रिंग तर्क को सत्यापित नहीं कर सकता है। यह चेतावनी तब उत्पन्न होती है जब संकलक मैन्युअल रूप से स्ट्रिंग में नहीं देख सकता है और यह सुनिश्चित करता है कि रनटाइम के दौरान आप सबकुछ आगे बढ़ेंगे। आइए कुछ उदाहरण देखें।

केस 1. इस स्ट्रिंग संकलन समय पर सत्यापित किया जा सकता और संकलक चेतावनी के बिना यह अनुमति देगा:

printf("This string has no format"); 

केस 2: इस मामले के लिए, संकलक पता लगा सकते हैं कि आप एक है प्रारूप विनिर्देशक और एक अलग चेतावनी उठाएगा। मेरी मशीन पर यह "चेतावनी: प्रारूप के लिए बहुत कम तर्क" कहा।

// This will most probably crash your machine 
printf("Not a safe string to %s"); 

प्रकरण 3. अब यह कुछ हद तक अपने मामले है। आप रनटाइम पर उत्पन्न स्ट्रिंग ले रहे हैं और इसे प्रिंट करने का प्रयास कर रहे हैं। आपको जो चेतावनी मिल रही है वह संकलक आपको चेतावनी देता है कि स्ट्रिंग में प्रारूप विनिर्देशक हो सकता है। उदाहरण के लिए कहें "खराब% sdata"। इस मामले में, रनटाइम% s से मेल खाने के लिए एक गैर-मौजूदा तर्क तक पहुंचने का प्रयास करेगा। इससे भी बदतर, यह उपयोगकर्ता आपके प्रोग्राम का शोषण करने का प्रयास कर सकता है (इसे पढ़ने के लिए सुरक्षित नहीं है जो डेटा पढ़ने के लिए)।

char str[200]; 
scanf("%s", str) 
printf(str) 
+0

एक फ़ंक्शन को कॉल करना जो 'const char *' की अपेक्षा करता है और इसे 'char *' देने से चेतावनी नहीं देता है, IMHO – terminus

+0

मैं यह सुझाव नहीं दे रहा था कि स्ट्रिंग को कास्ट किया जाए। मैं उल्लेख कर रहा था कि चेतावनी को ठीक करने के लिए दूसरे तर्क को निर्दिष्ट करने की आवश्यकता है। –

+0

"तर्क निर्दिष्ट करें" होने का क्या मतलब है? – UncleBens

14

तरह प्रारूप% s ऐसा नहीं होता, लागू तकनीकी रूप से एक तार के साथ एक printf की तरह फ़ंक्शन को कॉल के साथ कुछ भी गलत नहीं है, वहीं यह अभी भी बुरा व्यवहार है, क्योंकि स्ट्रिंग प्रारूप टोकन हो सकता है जैसे %s। यदि imp उदाहरण के लिए %s test है, तो बुरी चीजें घटित होंगी।

यदि आप फ़ॉर्मेटिंग के बिना imp प्रिंट करना चाहते हैं, तो आपको fputs(imp, fil) (उल्टा तर्कों को नोट करें) का उपयोग करना चाहिए।

+8

इससे भी बदतर: यदि उपयोगकर्ता आईपी स्ट्रिंग निर्दिष्ट कर सकता है, तो वह स्मृति को ओवरराइट करने के लिए% n प्रारूप टोकन का उपयोग करने में सक्षम हो सकता है। इसे प्रारूप स्ट्रिंग हमले के रूप में जाना जाता है और इंजेक्शन कोड चलाने के लिए इसका उपयोग किया जा सकता है। – ollb

+3

फ़ूट्स स्ट्रिंग सैन्स% स्वरूपण लिखने की चाल करता है। –

+0

"sans% formatting" से आपका क्या मतलब है? – TheRookierLearner

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