实验: 使用安全串函数

    技术2022-07-05  207

    安全串函数在<tchar.h>里面定义

     

    <2011_0501>

    这个月在维护Unicode编码的工程和使用xx_s的安全串函数, 感受到了好处。

    在构造xml结果表返回结果时崩溃, 查找原因是因为压入的结果表名太长。 那个类中的结果表明是个50bytes的数组。如果使用了安全串函数,就不会出现问题, 而且可以避免很多潜在的问题。最多就是分析的时候,过长表名被截断.

     

    使用unicode编码的工程,好处在于避免了多字节编码和unicode编码之间频繁的转换,而且可以使程序国际化.

     

    在编码中使用 _T("")来兼容ansi和unicode编码

    _stprintf_s等带 _s的函数来保证不会发生缓冲区溢出的崩溃, 维护程序方便.

     

    /** * @file UnicodeSafeString.cpp * @brief 验证unicode字符集和安全串操作函数的使用 * 参考 http://www.codeproject.com/KB/datetime/date_time_format.aspx */ #include "stdafx.h" #include <windows.h> /**< for INT etc*/ #include <vector> /**< for std */ #include <locale.h> /**< for codepage */ #include <tchar.h> /**< for _stprintf_s etc */ #ifdef _UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif /** * @name GetOsDefaultLocalCodePage * @note 得到操作系统默认的本地代码页 * @param VOID * @return TCHAR *, 返回本地代码页, 需要调用者执行free释放 */ TCHAR * GetOsDefaultLocalCodePage(); /** * @name SetCurCodePage * @note 设置当前代码页, 防止使用中文或国际化时乱码. * 设置新的代码页,返回旧的代码页. * @param TCHAR * pcNewCodePage, 需要设置的新代码页, * 假设代码页从多语言配置文件中得到 * 如果 (!pcNewCodePage), 返回的是当前代码页 * @return TCHAR *, 返回的新代码页, 需要调用者执行free释放 */ TCHAR * SetCurCodePage(TCHAR * pcNewCodePage); /** * @name MyFreePointer * @note 释放指针, 该指针是用malloc方法开辟出来的 * @param void ** pp, 需要释放的指针的地址 * return INT, 恒返回S_OK */ INT MyFreePointer(TCHAR ** pp); /** * @name MyCompareString * @note 比较2个串 * @param TCHAR * plhs, 需要比较的串1 * @param TCHAR * prhs, 需要比较的串2 * @return INT * @retval 0, 两个串相同 * @retval 非0, 两个串不同 */ INT MyCompareString(TCHAR * plhs, TCHAR * prhs); /** * @name fnTestUnicodeSafeString * @note 测试代码页操作, 设置代码页, 操作字符串 * @param VOID * @return INT, 恒返回S_OK */ INT fnTestUnicodeSafeString(); int _tmain(int argc, _TCHAR* argv[]) { TCHAR * pOsDefaultLocalCodePage = NULL; /**< 操作系统默认本地代码页 */ TCHAR * pOldCodePage = NULL; /**< 本程序当前代码页 */ TCHAR * pNewCodePage = NULL; /**< 需要设置的新代码页 */ /**< 程序默认使用的代码页: C */ pOldCodePage = SetCurCodePage(NULL); /** * 对于中文xpSp3, 得到本地代码页: Chinese_People's Republic of China.936 */ pOsDefaultLocalCodePage = GetOsDefaultLocalCodePage(); /** * 对于需要设置的新代码页, 实际应用中是从多语言配置文件中或其他途径获得 */ if(0 != MyCompareString(pOsDefaultLocalCodePage, pOldCodePage)) pNewCodePage = SetCurCodePage(pOsDefaultLocalCodePage); fnTestUnicodeSafeString(); MyFreePointer(&pNewCodePage); pNewCodePage = SetCurCodePage(pOldCodePage); /** 释放资源 */ MyFreePointer(&pOsDefaultLocalCodePage); MyFreePointer(&pOldCodePage); MyFreePointer(&pNewCodePage); /** run results * 早, vs2008 */ getchar(); return 0; } INT fnTestUnicodeSafeString() { CONST INT iLenBuf = 1024; TCHAR cBuf[iLenBuf]; tstring str1; _stprintf_s(cBuf, iLenBuf, _T("早, %s/n"), _T("vs2008")); str1 = cBuf; _tprintf(_T("%s/n"), str1.c_str()); return S_OK; } TCHAR * GetOsDefaultLocalCodePage() { const int STR_SZ = 1024; TCHAR szBuf[STR_SZ] = { 0 }; TCHAR szLocale[STR_SZ] = { 0 }; ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, szBuf, STR_SZ); _tcscpy_s(szLocale, STR_SZ, szBuf); ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SENGCOUNTRY, szBuf, STR_SZ); if (_tcsclen(szBuf) != 0){ _tcscat_s(szLocale, STR_SZ, _T("_")); _tcscat_s(szLocale, STR_SZ, szBuf); } ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, szBuf, STR_SZ); if (_tcsclen(szBuf) != 0){ _tcscat_s(szLocale, STR_SZ, _T(".")); _tcscat_s(szLocale, STR_SZ, szBuf); } return _tcsdup(szLocale); } TCHAR * SetCurCodePage(TCHAR * pcNewCodePage) { return _tcsdup(_tsetlocale(LC_ALL, pcNewCodePage)); } INT MyFreePointer(TCHAR ** pp) { if(pp && *pp) { free(*pp); *pp = NULL; } return S_OK; } INT MyCompareString(TCHAR * plhs, TCHAR * prhs) { return _tcscmp(plhs, prhs); }


    最新回复(0)