装运箱.32位格式崩溃
CString.Format crashes in 32-bit
我有一个CString格式,导致32位Unicode MFC Static/VS2013项目在SDK文件output.c行1629 while (i-- && *pwch)
崩溃
bool MyClass::Function1(LPCTSTR sAppName, HKEY hKey, LPCTSTR tcszValue1, LPCTSTR tcszValue2, LPCTSTR tcszValue3, BOOL bValue)
{
__int64 nAppId=0;
__int64 nId2=0;
sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName,
bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"),
nAppId, nId2, tcszValue1, tcszValue2, tcszValue3, bValue);
}
当我在64位中编译它时,它没有任何问题,在32位中,当sValue3为空时(但不是第一次,在第4次调用CString时)它崩溃了。sValue为空时的格式)
必须使用%lld
格式说明符,而不能使用%d
格式说明符。
在32位世界中,%d
期望32位整数。但是您提供64位整数作为参数。因此,您会得到未定义的行为,因为Format
将完全混淆参数。
不好!不允许在Format语句中使用CString对象。总是使用GetString!
CString sValue1 = tcszValue1;
CString sValue2 = tcszValue2;
CString sValue3 = tcszValue3;
sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName, bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"),
nAppId, nId2, sValue1.GetString(), sValue2.GetString(), sValue3.GetString(), bValue);
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- TDateTime格式在C++Builder中不会更改
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 装运箱.32位格式崩溃