发布新日志

  • _tcscat在Debug和Release下的问题

    2015-04-27 20:39:50

    背景: 
    有如下这么一段代码,作用是获取当前程序的所在路径(C:\work\A.exe),然后将”A.exe”去掉,拼装为”C:\work\inject.dll”

    TCHAR szDllPath[MAX_PATH] = _T("");
    TCHAR szExePath[MAX_PATH] = _T("");
    
    GetModuleFileName(GetModuleHandle(NULL), szExePath, MAX_PATH);
    
    int nIndex = 0;
    int i = lstrlen(szExePath);
    while (i > 0)
    {
        if (szExePath[i] == _T('\\'))
        {
            nIndex = i;
            break;
        }
        i--;
    }
    
    for (i = 0; i < nIndex + 1; i++ )
    {
        szDllPath[i] = szExePath[i];
    }
    
    _tcscat(szDllPath, _T("InjectDll.dll")); 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    问题

       1.Debug模式下运行,得到的结果是预期的"C:\\work\\inject.dll"。
    
       2.Release模式下运行,得到的结果却是"C:\\work\\",也就是_tcscat函数运行不成功。
    

    结论

       1.发现使用_tcscat可能存在风险问题,换用_tcscat_s就OK了。
    
       2.自从vc2005开始,微软力推_s安全版函数以取代不安全的标准非_s版函数,例如:strcat_s、strcopy_s、sprintf_s、_tcsnset_s、_tcsset_s、_tcstok_s...等等
    
       3.代码静态走查是可以关注字符串运算是否使用了_s安全版函数。
诸葛东明

诸葛东明

搜狗公司搜狗浏览器测试经理。2008年加入搜狗公司,负责搜狗浏览器的相关测试工作,见证了搜狗浏览器从无到有的过程。

数据统计

  • 访问量: 31460
  • 日志数: 19
  • 建立时间: 2008-06-03
  • 更新时间: 2015-06-23

RSS订阅

Open Toolbar