当strncpy()用于在MFC中复制字符串时,数据被截断

时间:2018-09-03 13:34:04

标签: c++ string mfc buffer-overflow strncpy

为了解决缓冲区溢出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 方法,但不可用。谁能帮我解决问题?

1 个答案:

答案 0 :(得分:2)

您的代码是错误的,并且没有执行您期望的操作。 lvItem.pszText是一个指针,根据项目的类型,它的固定大小为4个相应的8个字节。因此,您的sizeof运算符会导致截断。

以这种方式使用LVITEM,需要一个由您定义的缓冲区!

如果您使用GetIemText,也可以使用CListCtrl::SetItemText这个功能来处理所有限制。