为了解决缓冲区溢出Coverity问题,我已使用 strncpy()复制列表项。列表项需要从一行拖放到另一行。因此,需要复制的字符串包含'\ n','\ t'和''字符。
我使用了以下代码。
for (int nColumn = 1; nColumn < nColumns; nColumn++)
{
strncpy(lvItem.pszText, (LPCTSTR)(GetItemText(nDragIndex, nColumn)), sizeof(lvItem.pszText)-1);
lvItem.pszText[sizeof(lvItem.pszText)] = '\0';
lvItem.iSubItem = nColumn;
SetItem(&lvItem);
}
Coverity扫描已通过,但某些列中的数据被截断了。我听说过使用 strcpy_s 方法,但不可用。谁能帮我解决问题?
答案 0 :(得分:2)
您的代码是错误的,并且没有执行您期望的操作。 lvItem.pszText
是一个指针,根据项目的类型,它的固定大小为4个相应的8个字节。因此,您的sizeof运算符会导致截断。
以这种方式使用LVITEM
,需要一个由您定义的缓冲区!
如果您使用GetIemText
,也可以使用CListCtrl::SetItemText这个功能来处理所有限制。