c++ - `Snprintf_s` के साथ सुरक्षा की झूठी भावना




visual-c++ visual-studio-2005 (2)

उदाहरण गलत था।

कोड होना चाहिए:

char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

गलत कोड के लिए, यह एक बग हो सकता है कि संकलक ने कोई चेतावनी नहीं दी लेकिन यह स्नप्रिंटफ की कमजोर जांच होगी।

एमएसवीसी के "सुरक्षित" sprintf funcions में एक टेम्पलेट संस्करण है जो लक्ष्य बफर के आकार को जानता है। हालांकि, यह कोड bytes के अंत के बाद ढेर पर 5678 9 0 को खुशी से चित्रित करता है ...

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );

कोई विचार है कि मैं क्या गलत करता हूं, या यह एक ज्ञात बग है?

(मैं वीएस2005 में काम कर रहा हूं - 2008 या 2010 में परीक्षण नहीं किया था)


उदाहरण वास्तव में सही है। संस्करण के रूप में -

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

- जिसमें एसपी 1, विस्टा हॉटफिक्स और लाइब्रेरी हॉटफिक्स के कुछ शामिल हैं - उपर्युक्त फ़ंक्शन

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

अभी भी छोटी है। हालांकि, वास्तव में क्या आकर्षक है कि केवल 4 प्रकार के कार्यों का यह कार्य है

  • ठीक है: int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • छोटी गाड़ी: template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
  • ठीक है: int _snwprintf_s (विस्तृत वर्ण संस्करण)
  • ठीक है: template <size_t size> int _snwprintf_s (हाँ, विस्तृत वर्ण संस्करण ठीक है)

छोटी गाड़ी है, यह है कि अगर कोई गैर-टेम्पलेट संस्करण का उपयोग कर रहा है तो यह ठीक है, और यदि कोई विस्तृत वर्ण संस्करणों का उपयोग कर रहा है तो यह भी ठीक है। गजब का।





visual-c++-2005