_In_
और _Out_
(टिप्पणी: न तो _in_/_out
_ के रूप में आप ने लिखा है, और न ही __In__/__Out__
डबल अंडरस्कोर, कुछ अन्य जवाब में लिखा के रूप में) के साथ तो साल एनोटेशन कहा जाता है। उनका उपयोग /analyze
कंपाइलर विकल्प के साथ किया जा सकता है, और कच्चे सी बफर और पॉइंटर्स के साथ बफर ओवररन्स इत्यादि जैसी बग और समस्याओं की पहचान करने में मदद कर सकता है। MSDN documentation on SAL के अतिरिक्त, आप यह भी blog post पढ़ सकते हैं।
किसी विडंबना यह है कि (और को गलत तरीके से) ने लिखा है कि:
"दुनिया के बाकी हिस्सों में, आदानों स्थिरांक संकेत दिए गए हैं, लेकिन मुझे लगता है कि कि भी आसान था :)।"
इस तथ्य को याद नहीं है कि SAL उससे अधिक शक्तिशाली है। वास्तव में, एसएएल के साथ आप गंतव्य बफर का अधिकतम आकार भी निर्दिष्ट कर सकते हैं, यह दर्शाता है कि कौन से पैरामीटर में गंतव्य बफर आकार होता है; जैसे यदि आप <strsafe.h>
हैडर खोलते हैं, तो आप पढ़ सकते हैं कि वास्तविक साल StringCbPrintfW
(StringCbPrintf
का यूनिकोड संस्करण) के लिए इस्तेमाल किया एनोटेशन ऐसा ही कुछ है:
STRSAFEAPI
StringCbPrintfW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in __format_string STRSAFE_LPCWSTR pszFormat,
...)
{
....
नोट कैसे __out_bcount(cbDest)
साल एनोटेशन pszDest
पैरामीटर के लिए लागू निर्दिष्ट करता है यह है कि एक उत्पादन बफर (__out
) है, जो आकार पैरामीटर cbDest
द्वारा बाइट्स (_bcount
) में व्यक्त किया जाता है के लिए सूचक है। जैसा कि आप देख सकते हैं, यह समृद्ध एनोटेशन (सरल "const
" या "गैर const
" से समृद्ध है)।
मेरी राय में, साल एक तरह से बेकार है अगर आप सी std::vector
या std::string
की तरह मजबूत कंटेनर कक्षाएं, जो अपने ही आकार, आदि पता लेकिन साल कच्चे संकेत के साथ सी-ish कोड में उपयोगी हो सकता है के साथ ++ कोड लिखने (जैसे कई Win32 एपीआई)।
अपने प्रश्न के दूसरे भाग के बारे में:
मुख्य कारण यह है कि sprintf
एक असुरक्षित है कि "क्यों हम StringCbPrintf
जरूरत है अगर हम पहले से ही sprintf
है" और overruns- बफ़र प्रवण समारोह; इसके बजाय StringCbPrintf
के साथ आपको गंतव्य बफर का अधिकतम आकार निर्दिष्ट करना होगा, और यह बफर ओवररन्स को रोकने में मदद कर सकता है (जो सुरक्षा दुश्मन हैं)।
जोड़ा गया "विंडोज़" और "winapi" टैग, क्योंकि इस प्रश्न में एसएएल एनोटेशन शामिल हैं, जो विंडोज विशिष्ट हैं। –
ध्यान दें कि '_in_' और' _out_' वैध SAL मान्य नहीं हैं (वे शुरुआती पूंजी पत्र के साथ '_In_' और' _Out_' हैं)। एक वैकल्पिक वैध एसएएल अग्रणी डबल अंडरस्कोर (और लोअरकेस प्रारंभिक अक्षर) के साथ है: '__in' और' __out'। –