共用方式為


CRT 中的安全性功能

許多舊的 CRT 函式都有較新且更安全的版本。 如果存在安全函式,較舊且較不安全的版本會標示為已被取代。 新版本具有 _s (“secure”) 後綴。

在這個上下文中,「棄用」表示不建議使用該函式。 這並不表示函式會從CRT中移除。

安全函式不會防止或更正安全性錯誤。 相反地,它們會在發生錯誤時攔截錯誤。 他們會對錯誤狀況進行額外的檢查。 如果發生錯誤,則會叫用錯誤處理程式(請參閱 參數驗證)。

例如,strcpy 函數無法判斷它所複製的字串是否過大,無法適應目的地緩衝區。 其安全對應 strcpy_s專案會採用緩衝區的大小作為參數。 因此,它可以判斷是否會發生緩衝區溢位。 如果您使用 strcpy_s 將 11 個字元複製到 10 個字元緩衝區中,這是您部分的錯誤; 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_access),或藉由定義 _CRT_NONSTDC_NO_WARNINGS 來停用 POSIX 相關的取代警告。 如需詳細資訊,請參閱相容性

更多安全性功能

某些安全性功能包括:

  • 參數驗證

    保護函式及其許多不安全的對應專案,都會驗證參數。 驗證可能包括:

    • 正在檢查 NULL 值。
    • 檢查列舉值的有效性。
    • 檢查整數值是否在有效範圍內。

    如需詳細資訊,請參閱 參數驗證

    無效參數的處理常式也可供開發人員存取。 當函式遇到無效參數時,CRT 允許您透過 _set_invalid_parameter_handler_set_thread_local_invalid_parameter_handler 檢查這些問題,而不是執行斷言並退出應用程式。

  • 大小緩衝區

    您必須將緩衝區大小傳遞至寫入緩衝區的任何安全函式。 安全性版本會先確認緩衝區的大小是否足夠,然後再寫入。 驗證可協助避免可能允許惡意代碼執行的危險緩衝區溢出錯誤。 如果緩衝區的大小太小,這些函式通常會傳回 errno 錯誤碼,並叫用無效的參數處理程式。 讀取輸入緩衝區的函式 (例如 gets) 具有會要求您指定大小上限的安全版本。

    某些安全性增強型 CRT 函式的偵錯版本會以特殊字元填滿傳遞給它們的緩衝區(0xFE)。 用於填充的字元有助於尋找將錯誤大小傳遞給函數的情況。 不幸的是,它也降低了性能。 若要改善效能,請使用 _CrtSetDebugFillThreshold 來停用緩衝區填滿。 如需詳細資訊,以及具有此行為的函式清單,請參閱 _CrtSetDebugFillThreshold

  • 空字元結尾

    留下可能未結束字串的某些函式具有安全版本,以確保字串正確以 Null 終止。

  • 增強的錯誤報告

    安全函式會傳回錯誤碼,其錯誤資訊比預先存在的函式還多。 安全功能和許多現有的功能現在也已設定 errno,並經常回傳一個 errno 代碼類型,以提供更好的錯誤報告。

  • 檔案系統安全性

    安全的檔案 I/O API 支援預設案例中的安全檔案存取。

  • Windows 安全性 (機器翻譯)

    安全的程序 API 會強制執行安全性原則,並允許指定 ACL。

  • 格式化字串語法檢查

    例如,當您在格式字串中使用 printf 不正確的類型欄位字元時,會偵測到無效的字串。

另請參閱

參數驗證
安全範本重載
.lib