C26485警告:异常处理中TCHAR数组触发指针衰减警告求解
C26485警告触发原因及解决方案
触发原因
C26485属于微软C代码分析工具中对应C核心准则bounds.3的检查项,规则要求禁止数组到指针的隐式退化,避免丢失数组边界信息引发越界访问风险。
你代码中定义的szError是长度为_MAX_PATH的TCHAR类型数组,而GetErrorMessage、AfxMessageBox两个函数的对应入参要求的是TCHAR*指针类型。直接传递数组名时会发生隐式的数组到指针退化,静态检查器无法再通过指针追踪到原来的数组长度信息,无法验证后续内存操作是否存在越界,因此触发该警告。
解决方案
方案1:显式指定取首元素地址(适配原有写法)
将传递的参数从szError改为&szError[0],显式声明你是主动获取数组首元素的指针,而非隐式发生数组退化,静态检查器识别到显式操作后就不会触发警告,修改后代码如下:
catch (CDBException* e) { TCHAR szError[_MAX_PATH]; e->GetErrorMessage(&szError[0], _MAX_PATH); AfxMessageBox(&szError[0]); }
方案2:使用更安全的MFC字符串类(推荐)
CDBException的GetErrorMessage提供了直接返回CString的重载,不需要手动管理字符缓冲区,从根源避免数组退化问题,代码更简洁安全:
catch (CDBException* e) { CString strError = e->GetErrorMessage(); AfxMessageBox(strError); }
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

