今天在调试程序时发现这个函数似乎有bug? TCHAR strNumber[MYSTRINGLEN] = {'\0'};
swprintf_s(strNumber,MYSTRINGLEN,L"%lu",m_Axis1.dwYUpper);看起来似乎没有问题,但是调试时却发现swprintf_s()完全是越界访问了,而且把strNumber[]后面的一个窗口句柄变量都改写掉了!
未执行字符串写入操作前的数组:执行了函数操作后的字符串数组--的确获得了整形数值1500,但是后面却被莫名其妙地写入了65278?
居然写过了行末?
谁研究过这个吗?
我还发现如果改为memcpy_s()来实现字符串拷贝则不再出现越界写操作了?很奇怪的说?
swprintf_s(strNumber,MYSTRINGLEN,L"%lu",m_Axis1.dwYUpper);看起来似乎没有问题,但是调试时却发现swprintf_s()完全是越界访问了,而且把strNumber[]后面的一个窗口句柄变量都改写掉了!
未执行字符串写入操作前的数组:执行了函数操作后的字符串数组--的确获得了整形数值1500,但是后面却被莫名其妙地写入了65278?
居然写过了行末?
谁研究过这个吗?
我还发现如果改为memcpy_s()来实现字符串拷贝则不再出现越界写操作了?很奇怪的说?
解决方案 »
- 关于odbc和ado的问题
- VC2010 创建向导对话框的奇怪问题
- 轻松实现类VC界面的CCoolBar编译问题
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)里的变量设置成static是不是能节省下分配内存的时间??
- 我不小心用mysqlfront把一个mysql数据库删除了,能不能恢复(没有备份),大家一定要救我阿。
- 这样的数据是保存在哪里呀!
- 两个对话框互相打开和隐藏?
- 怎么看控件是否已被销毁?
- WPS 不同风格界面切换是如何实现的?
- Picture Control控件如何动态加载资源文件
- 请问哪位能提供字符串加密和解密的函数
- 100分求C++写的牛顿-高斯拟合算法
swprintf_s(strNumber,MYSTRINGLEN,L"%lu",m_Axis1.dwYUpper);
typedef WCHAR TCHAR, *PTCHAR;
不单是swprintf_s()有这个问题,还有_itow(),_itow_s()全部都会自动越界访问,根本无法控制。
wchar_t *buffer,
size_t count,
const wchar_t *format [,
argument] ...
);TCHAR strNumber[MYSTRINGLEN] = {'\0'};
swprintf_s(strNumber,MYSTRINGLEN,L"%lu",m_Axis1.dwYUpper);// 问一下,MYSTRINGLEN的值是多少?
这个函数其实是“畸形”的因为他会首先依据MYSTRINGLEN的大小,使用memset()将strNumber指针指向的区域设置为0.如果MYSTRINGLEN的长度大于strNumber的实际长度,则内存越界就是必然的。建议使用<strsafe.h> 中的 StringCchPrintf(...)
stprintf_s(strNumber,MYSTRINGLEN,_T("%lu"),m_Axis1.dwYUpper);
如果都配套的话,应该不会出现这种问题吧。因为像swprintf类的函数,locale、参数的类型设置什么的都会产生复杂的影响。不要用这种混合代码。4楼说的有问题,既然用MYSTRINGLEN定义的数组,而且微软的实例也是那样的,况且溢出的也不是0而是65278……
另外的VS装了SP1了么,也可能是bug。