安全範本多載
許多的 CRT 函式已被取代為主的安全性強化的較新版本 (例如, strcpy_s更安全取代strcpy)。CRT 提供範本的多載,可以幫助簡化轉換成比較安全的變數。
這段程式碼,例如產生警告,因為strcpy已被取代:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
您可以忽略這個警告。定義的符號**_CRT_SECURE_NO_WARNINGS隱藏警告,或更新的程式碼使用strcpy_s**:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
範本多載會提供額外的選擇。定義**_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES為 1 會啟用自動呼叫比較安全的變數的一般 CRT 函式樣板的多載。如果_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES為 1,則不不需要的程式碼的任何變更。私底下來說,呼叫strcpy將變更為呼叫strcpy_s**與自動提供的 size 引數。
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES不會影響函式計數,例如strncpy。若要啟用樣板計數的函式的多載,定義**_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT**為 1。之前這樣做,不過,請確定您的程式碼會傳遞的字元計數,不緩衝區 (常見的錯誤) 的大小。此外,代碼稱為安全的變體不必要函式呼叫之後有明確寫入緩衝區的結尾的 null 終端子。如果您需要截斷行為,請參閱_TRUNCATE。
注意事項 |
---|
巨集_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT不能_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES也會定義成 1。如果_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT被定義為 1 和_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES定義計算時,應用程式將不會執行任何的範本多載。 |
定義**_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES為 1 會啟用的安全的變數 (名稱結尾"_s") 的範本多載。如此一來,如果_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES**為 1,則必須進行一項小變更原來的程式碼:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
函式的名稱,就需要變更 (藉由加入"_s")。 範本多載會負責提供 size 引數。
預設情況下, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES和**_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT被定義為 0 (停用) 和_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES**被定義為 1 (啟用)。
請注意,這些範本多載靜態陣列的唯一的工作。動態配置的緩衝區需要額外的原始程式碼變更。重新認識上述的範例:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; have to change to
// strcpy_s(szBuf, 10, "test");
和這個:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; have to change to
// strcpy_s(szBuf, 10, "test");