_tcscat在Debug和Release下的问题

背景

有如下这么一段代码,作用是获取当前程序的所在路径(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.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安全版函数。
时间: 2024-11-03 22:05:40

_tcscat在Debug和Release下的问题的相关文章

debug和release下PostThreadMessage的异同

MFC中创建线程分为工作线程和UI线程.其中UI线程可以通过继承CWinThread进行创建. 创建函数如下: CWinThread *m_pRecogThread;//语音识别线程 m_pRecogThread =(CSpeechRecogThread *) AfxBeginThread(RUNTIME_CLASS(CSpeechRecogThread)); 这样就创建了UI线程,就可以通过m_pRecogThread->PostThreadMessage(UM_VERIFY_AVAILABI

(原)Vs中debug和release结果不一致

转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5598091.html 前两天调试程序,出现了一个很蛋疼的问题,debug和release结果不一致.网上很多都说是变量没有初始化,但是我这边变量已经初始化了. 最后仔细检查,找到了debug和release下代码结果不一致的地方.将该部分代码提取并简化,如下所示: int MatrixPlusDiagVec(float* pMat, const float* pVec, int dim) { for

VC下Debug 和 Release 版本区别

Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动.如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来.当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等.习惯上,我们仍然更愿意使用VC已经定义好的名称.     Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M).至于是否需要DLL支持,主要看你采用的编译选项.如果是基于 ATL的,则Debug

Debug下正常release下程序出错

今天遇到一个奇怪的问题,debug下写的程序,换成release下运行就出错了.问题排查了一整天.原来链接的lib有误.qt库debug下的lib和release下的lib名字是不一样的. debug下的lib:QtCored4.libQtGuid4.libQtXmld4.libQtSqld4.lib release下的lib:QtCore4.libQtGui4.libQtXml4.libQtSql4.lib 转自: www.pailm.com

release下不输出NSLog打印的内容,debug下才输出。

软件运行越来越慢,突然在想,是不是因为NSLog,太多的原因.因为自己总是喜欢用NSLog打印出变量,然后,在进行调试程序,找Bug. 网上查找资料,果然,和这个还是有点关系的. 直接上代码,使其在release下不输出NSLog打印的内容,debug下才输出. 要注意,这部分代码是要写在prefix.pch中的. // 在debug模式下输出NSLog,在release模式下不输出NSLog #ifndef __OPTIMIZE__ #define NSLog(...) NSLog(__VA_

Objective-C与Swift下的自定义打印函数(Debug和Release)

1.Objective-C 在使用Objective-C进行开发的过程中,为了Debug会不断的设置打印函数.如下图是我们经常用的,用来测试监听方法的实现与否: 1 NSLog(@"%s", __func__); 2 NSLog(@"%s", __FUNCTION__); 需要说明的是,__func__和__FUNCTION__都是C的预定义符号,代表的含义完全相同,就是返回 类名+方法名 的字符串. 注意:1.返回的字符串是C语言的字符串 char * 类型,注意

在用VC编译下debug和release的什么区别

DEBUG和RELEASE 版本差异及调试相关问题:.         内存分配问题 1.          变量未初始化.下面的程序在debug中运行的很好. thing * search(thing * something)        BOOL found;        for(int i = 0; i < whatever.GetSize(); i++)          {          if(whatever[i]->field == something->field

关于VS2013优化后MFC中对文件读取失败的解析(debug下可以,release下失败)

经测试: 错误来源于:如下程序,在vs2010下使用GetFileName(),文件可以成功读取,但在VS2013下,使用GetFileName()读取文件在debug下可以,但release下失败,改为GetPathName()后,便可以成功编译. CFileDialog filePCloudDlg(TRUE); filePCloudDlg.m_ofn.lpstrTitle=_T("选择点云文件"); filePCloudDlg.m_ofn.lpstrFilter=_T("

VS下 debug与release运行结果不一致

网罗了大量文章,主要说变量未初始化的较多,代码量较大,着实不好搞,依次排查,但凡涉及的都已经初始化,无果... eggs hurt~~~持续~~~ 最后初步敲定嫌疑:PI的问题,每次用到介个全局变量的时候就报错,把代码中PI用3.1415926****代替,无果... eggs hurt~~~持续~~~ NNGX,PI的定义在.h头文件里,最后挪到.cpp里好了,有中踏空感~擦一下~Mark一下~ 网罗的大量文章里面推荐一篇,(貌似这哥们儿也是转的,呃...不深究了) 地址:http://blo