安全字串處理函式
轉自:http://blog.csdn.net/zhang1chao5/article/details/7329830
緩衝區溢位錯誤(這是處理字串時的典型錯誤)已成為針對應用程式乃至作業系統的各個元件發起安全攻擊的媒介。,所以Microsoft在C執行庫中新增了很多安全函式。我們應該儘量使用這些新函式來防止應用程式在處理字串的時候發生的緩衝區溢位。
建議使用Unicode字串,而且始終應該通過新的安全字串函式來處理這些字串。
一、新的安全字串函式
C中的所有字串處理函式,都對應一個新版本的函式,前面名稱相同,但是最後新增了一個字尾 _s (代表secure)。如:
PTSTR _tcscpy (PTSTR strDestination, PCTSTR strSource ) ; //這是C執行庫現有的字串函式
errno_t _tcscpy_s(PTSTR strDestination, size_t numberOfCharacters ,PCTSTR strSource ) ;//新增安全函式
還有memcpy_s,memmove_s,wmencpy,wmemove_s等函式
這類函式檢查的專案有 1、指標不為空
2、整數在有效範圍內
3、列舉值是有效地
4、緩衝區足以容納結果資料
如果這些檢查中有一項失敗,函式就會設定區域性與執行緒的C執行時變數errno,然後返回一個errno_t值來指出成功或是失敗。然而,這些函式並不實際返回(如果有自己的處理函式是可以返回的,見上篇博文)。如果是debug build,則會呼叫 Debug Assertion Failed,然後終止應用程式(即利用斷言),如果是release build,程式自動終止。
C執行時實際允許我們自己提供處理函式。見上一篇博文
二、有更多控制力的處理函式
在Microsoft的StrSafe.h檔案中定義新的安全字串函式,除了新的安全字串函式,還新增了一些函式,用於在執行字串處理時提供更多的控制。可以控制填充符,或者指定如何進行截斷
下面為部分原型:常用的
HRESULT StringCchCat( PTSTR pszDest, size_t cchDest, PCTSTR pszSrc) ;
HRESULT StringCchCatEx( PTSTR pszDest, size_t cchDest, PCTSTR pszSrc,
PTSTR*ppszDestEnd, size_t *pcchRemaining, DWORD dwFlags );
還有 StringCchCpy
StringCchCpyEx
StringCchPrintf
StringCchPrintfEx等
可以看出 含有“Cch”,這表示count of characters即字元數,通常用_countof巨集來獲取。
還有含有“Cb”,如StringCbCat(Ex),StringCbCopy(Ex),StringCbPrintf(Ex) 這些函式指定的是位元組數(轉者注:count of bytes),
通常使用sizeof操作符來獲取此值
這些函式都返回HRESULT不同於安全函式(帶_S字尾的),當緩衝區太小的時候,這些函式會執行截斷
詳情請見MSDN
三、windows字串函式
windows也提供了各種字串處理函式。
例如我們經常比較字串以進行相等性測試或是排序,為此,最理想的函式是
CompareString(Ex)和 CompareStringOrdinal
第一個函式功能大用法比較複雜,對於這兩個函式的用法,請見MSDN
注:只支援unicode
相關文章
- C語言之字串處理函式C語言字串函式
- SQL中的常用的字串處理函式大全SQL字串函式
- 陣列處理函式陣列函式
- C++ 字串 cctype 標頭檔案標準庫處理函式C++字串函式
- 字串處理字串
- Flink處理函式實戰之四:視窗處理函式
- Sanic 處理函式修飾器函式
- mongoDB中聚合函式java處理MongoDB函式Java
- JavaScript 註冊事件處理函式JavaScript事件函式
- echarts 繫結事件處理函式Echarts事件函式
- Flink處理函式實戰之五:CoProcessFunction(雙流處理)函式Function
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- JavaScript 批量註冊事件處理函式JavaScript事件函式
- JavaScript 非同步函式的 Promisification 處理JavaScript非同步函式
- 六、函式、包和錯誤處理函式
- Oracle 字串函式Oracle字串函式
- Oracle 字串函式Oracle字串函式
- 字串函式 metaphone ()字串函式
- 字串函式 print ()字串函式
- 字串函式 explode ()字串函式
- 字串函式 ord ()字串函式
- 字串函式 ltrim ()字串函式
- 字串函式 levenshtein ()字串函式
- 字串函式 lcfirst ()字串函式
- 字串函式 implode ()字串函式
- 字串函式 fprintf ()字串函式
- 字串函式 htmlentities ()字串函式HTML
- 字串函式 htmlspecialchars ()字串函式HTML
- PHP字串函式PHP字串函式
- MySQL 字串函式:字串擷取MySql字串函式
- PHP 每日一函式 — 字串函式 crypt ()PHP函式字串
- PHP 每日一函式 — 字串函式 chr ()PHP函式字串
- PHP 每日一函式 — 字串函式 addslashes ()PHP函式字串
- PHP 每日一函式 — 字串函式 addcslashes ()PHP函式字串
- MySQL函式學習(一)-----字串函式MySql函式字串
- T-SQL——函式——字串操作函式SQL函式字串
- thinkphp 輸出變數使用函式處理PHP變數函式
- for迴圈批量註冊事件處理函式事件函式
- Clickhouse SQL日期處理函式及案例分享SQL函式