安全字符串处理函数

来源:互联网 发布:物流接单软件 编辑:程序博客网 时间:2024/06/05 11:25

转自: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


原创粉丝点击