關於 Strsafe.h
與緩衝區溢位相關的許多安全性問題都與不良的緩衝區處理有關。 Strsafe.h 中定義的函式會為程式代碼中的適當緩衝區處理提供額外的處理。 因此,它們的目的是要取代其內建 C/C++對應專案,以及特定的 Windows 實作。 從 Windows XP 搭配 Service Pack 2 (SP2) 開始,Windows SDK 中提供 Strsafe.h。
Strsafe 函式的優點包括:
目的地緩衝區的大小一律會提供給函式,以確保函式不會寫入超過緩衝區的範圍。
即使作業截斷預定的結果,緩衝區仍保證以 Null 終止。
所有函式都會傳回HRESULT 值,只有一個可能的成功程式代碼(S_OK)。
每個函式都可在對應的字元計數 (“cch”) 或位元組計數 (“cb”) 版本中取得。
大部分的函式都有適用於進階功能的擴充版 (“Ex”) 版本。
如需詳細資訊,請參閱下列各節。
字元計數函式
下列函式會使用字元計數,而不是位元組計數。
函式 | 替換 |
---|---|
, | |
位元組計數函式
下列函式會使用位元組計數,而不是字元計數。
函式 | 取代 |
---|---|
使用 Strsafe.h
若要內嵌使用 Strsafe 函式,請在其他所有頭檔的 #include 語句之後,如下所示,加入相應的頭檔。
#include <strsafe.h>
若要以函式庫形式使用這些函式,請在包含 Strsafe.h 之前先包含下列語句。 不過,建議您使用內嵌函式。
#define STRSAFE_LIB
注意
:下列函式必須作為內嵌函式使用:StringCbGets、StringCbGetsEx、StringCchGets 和 StringCchGetsEx。
當您在檔案中包含 Strsafe.h 時,由 Strsafe.h 函式取代的較舊函式將會淘汰。 嘗試使用這些較舊的函式會導致編譯程序錯誤,告知您使用較新的函式。 如果您想要覆寫此行為,請先包含下列語句,再包含 Strsafe.h。
#define STRSAFE_NO_DEPRECATE
若要只允許字元計數函式,請在包含 Strsafe.h 之前包含下列語句。
#define STRSAFE_NO_CB_FUNCTIONS
若要只允許位元組計數函式,請在包含 Strsafe.h 之前包含下列語句。
#define STRSAFE_NO_CCH_FUNCTIONS
注意
您可以定義STRSAFE_NO_CB_FUNCTIONS或STRSAFE_NO_CCH_FUNCTIONS,但不能同時定義兩者。
某些 Strsafe 函式具有地區設定感知版本。 根據預設,標頭不會宣告這些函式。 若要啟用這些宣告,請先包含下列巨集語句,再包含 Strsafe.h。
#define STRSAFE_LOCALE_FUNCTIONS
支援的字串長度上限為 2,147,483,647 個字元,STRSAFE_MAX_CCH,無論是 ANSI 或 Unicode。
相關主題