安全性功能,則在 CRT 中
許多舊的 CRT 函式中都有更新、 更安全版本。如果安全的函式存在,較舊的、 較不安全的版本就會標記為已被取代,而且新的版本有_s (「 安全 」) 的尾碼。
在此情況下,"已取代"只是表示不建議在函式的使用。 此數值並未顯示函式會從 CRT 移除排程。
安全的函式不防止或修正安全性錯誤; 相反地,它們攔截錯誤發生時。它們執行其他的檢查錯誤狀況,並在錯誤的情況下它們叫用錯誤處理常式 (請參閱參數驗證)。
例如, strcpy函式就無從告訴它正在複製的字串是否為它的目的緩衝區太大。然而,其安全的對應項, strcpy_s、 做為參數緩衝區的大小,讓它可以判斷緩衝區滿溢就會發生。如果您使用strcpy_s ,將十一個字元複製到十個字元緩衝區中,會發生錯誤 ; strcpy_s無法修正您的錯誤,但是它可以偵測您的錯誤,並藉由叫用無效的參數處理常式會通知您。
消除反對警告訊息
有幾種方式可以消除舊且更不安全的函式的反對警告訊息。最簡單是只需定義_CRT_SECURE_NO_WARNINGS ,或使用warning pragma。將會停用反對警告訊息,,但當然造成警告安全性問題仍然存在。最好將取代警告啟用,並善用新的 CRT 安全性功能。
在 C++ 中,最簡單的方法就是使用安全範本多載,在許多情況下會消除反對警告訊息,以呼叫這些函式的新安全版本來取代已取代的函式呼叫。比方說,請考慮這個已取代的呼叫strcpy:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
定義_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES為 1,進而消除這項警告strcpy呼叫strcpy_s,因此造成緩衝區滿溢。如需詳細資訊,請參閱 安全範本多載。
這些已被取代的函式不安全的樣板的多載的情況下,您應該明確地考慮手動更新您的程式碼使用的安全版本。
另一個來源反對警告訊息,不相關的安全性,為 POSIX 函式。取代標準的對等用法的 POSIX 函式名稱 (例如,變更存取到 _access),或停用 POSIX 相關反對警告訊息,藉由定義_CRT_NONSTDC_NO_WARNINGS。如需詳細資訊,請參閱 Deprecated CRT Functions。
其他安全性功能
安全性功能包括下列:
Parameter Validation.傳遞至 CRT 函式的參數必須經過驗證,在這兩種安全的函式和函式的許多預先存在的版本。這些驗證包括:
正在檢查NULL值傳遞至函式。
正在檢查有效性的列舉的值。
正在檢查整數的值有效的範圍內。
如需詳細資訊,請參閱 參數驗證。
無效的參數處理常式也是開發人員可存取的。當遇到無效的參數,判斷提示,並結束應用程式,而非 CRT 會提供方法來檢查這些問題的_set_invalid_parameter_handler函式。
Sized Buffers.安全的函式需要的緩衝區大小會傳遞至任何將寫入緩衝區的函式。安全版本驗證緩衝區夠大,足以寫入之前,有助於避免攻擊者執行惡意程式碼的危險的緩衝區滿溢錯誤。通常這些函數會傳回errno輸入錯誤的程式碼,並叫用無效的參數處理常式,如果緩衝區的大小太小。從輸入緩衝區,例如讀取的函式gets,您必須指定最大容量的安全版本。
Null termination.左邊可能未終止的字串已確定字串的安全版本的某些函式正確的 null 結束。
Enhanced error reporting.安全的函數會傳回含有錯誤的詳細資訊無法以預先存在的函式的錯誤碼。安全的函式,並有許多預先存在的功能現在設定errno ,通常會傳回errno型別,以提供更佳的錯誤報告的程式碼。
Filesystem security.安全的檔案 I/O 的 Api 支援安全的檔案存取權,在預設情況下。
Windows security.安全的處理序 Api 強制執行安全性原則,並允許指定的 Acl。
Format string syntax checking.無效的字串會偵測到,比方說,使用不正確的型別中的功能變數字元 printf格式化字串。