Win32 C++项目如何使用_malloca替代_alloca处理W2A宏告警
关于C6255警告的处理方案
能不能直接忽略警告
如果你的项目中所有调用W2A的场景输入宽字符串长度都完全可控,比如你当前代码里的sDelim只是最多几个字符的分隔符,不会出现超长输入,可以暂时忽略该警告。但如果后续存在传入超长未知长度宽字符串的可能,alloca触发栈溢出导致进程崩溃的风险真实存在,不建议长期忽略。
按照提示修改W2A宏的方法
把宏定义中的alloca替换为_malloca即可匹配警告的优化建议,修改后的宏代码如下:
#define W2A(lpw) (\ ((_lpw = lpw) == NULL) ? NULL : (\ (_convert = (static_cast<int>(wcslen(_lpw))+1), \ (_convert>INT_MAX/2) ? NULL : \ ATLW2AHELPER((LPSTR) _malloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), _acp))))
注意:
_malloca分配的内存必须配套调用_freea释放,哪怕实际是从栈分配的内存_freea也会自动处理为空操作,不会出问题。比如你当前的j2cs函数,在使用完cDelim之后需要加一行_freea(cDelim);避免内存泄漏。
更推荐的替代方案(不需要改宏)
你可以直接使用VS2019自带的ATL字符串转换类CW2A替代旧的W2A宏,不需要依赖USES_CONVERSION,也不需要手动管理内存,完全不会触发该警告,代码修改示例如下:
BSTR __stdcall j2cs( const long lJulian, int bDMY, BSTR sDelim ) { // 删掉原来的USES_CONVERSION int iDay, iMonth; long lYear; char chDate[20]; char chInt[10]; CW2A cDelim(sDelim); // 直接构造转换对象 // 后续访问char*类型的分隔符用cDelim.m_psz即可
内容的提问来源于stack exchange,提问作者bugmagnet
相关产品推荐
相关产品推荐

