2010-02-08 11 views
13

अग्रिम माफी मांगने की चेतावनियां कैसे प्राप्त करें।यदि मैं खराब शब्दावली का उपयोग करता हूं तो गलत स्ट्रिंग स्वरूपण (सी ++)

जब मैं एक सी संकलन gdb और उपयोग printf (तहत ++ एप्लिकेशन) यह मेरे भयानक प्रारूप स्ट्रिंग की स्थिरता से संबंधित चेतावनी और तर्क में पारित देता

जैसे, इस कोड:।

printf("%s %s", "foo"); 

परिणामस्वरूप एक कंपाइलर चेतावनी "स्वरूप के लिए बहुत कम तर्क" है, जो अति-उपयोगी है। यह प्रारूप स्ट्रिंग प्रकार बनाम तर्क प्रकार के बारे में भी चेतावनियां देगा। यह प्रारूप स्ट्रिंग का निरीक्षण किया होगा और आपूर्ति किए गए तर्क प्रकारों के मुकाबले इसकी तुलना की जानी चाहिए। - इस प्रकार का संकलन-समय आत्मनिरीक्षण कुछ है जिसे सामान्य स्रोत कोड में जोड़ा जा सकता है, या यह ऐसा कुछ है जिसे जीसीसी में संकलित करने की आवश्यकता है?

fwiw यह ओएस एक्स पर जीसीसी 4.2.1 के तहत है।

उत्तर

9

आप (तरह strfmon कार्यों के साथ-साथ scanf/strftime/के लिए) अपनी printf-जैसे कार्यों के लिए इस तरह सामान कर सकते हैं:

#define PRINTF_FORMAT_CHECK(format_index, args_index) __attribute__ ((__format__(printf, format_index, args_index))) 

void my_printf(const char *fmt, ...) PRINTF_FORMAT_CHECK(1, 2); 

अधिक जानकारी के लिए gcc manual देखें।

+3

मैनुअल में अन्य विकल्पों का एक समूह है; हालांकि वे सभी वैरैडिक कार्यों के सामान्य मामले को कवर करने के लिए पर्याप्त नहीं हो सकते हैं। –

+2

हुह; गंधा। धन्यवाद पॉल। आदमी पेज से: "प्रारूप विशेषता निर्दिष्ट एक समारोह printf, scanf, strftime या strfmon शैली तर्क जो एक प्रारूप स्ट्रिंग के खिलाफ प्रकार- जाँच की जानी चाहिए लेता है कि" तो यह की तरह है, तो मैं अपने अखरोट के स्वाद का कमी है लग रहा है (उदाहरण के लिए प्रिंटफ-फ़ंक्शन के परिवार के अलावा कुछ और) यह वास्तव में चाल नहीं करेगा, लेकिन आपके द्वारा लिंक किए गए पृष्ठ में अन्य रोचक __attributes__ का एक पूरा समूह है। धन्यवाद ! –

+0

बहुत बढ़िया। किसी को पता है कि इंटेल सी कंपाइलर के समान कुछ है या नहीं? मुझे मैनुअल में कुछ भी नहीं मिला। – pavon

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

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