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

Data truncated when strncpy() used for copying string in MFC

为了修复缓冲区溢出 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)] = '[=10=]';
    lvItem.iSubItem = nColumn;
    SetItem(&lvItem);
}

Coverity 扫描已通过,但某些列中的数据被截断。我听说过使用 strcpy_s 方法但不可用。谁能帮我解决问题?

您的代码有误,没有达到您的预期。 lvItem.pszText 是一个指针,它的大小固定为 4 个 8 个字节,具体取决于您的项目类型。所以你的 sizeof 运算符导致截断。

这样使用LVITEM,需要一个你自己定义的缓冲区!

如果你使用GetIemText,你也可以使用CListCtrl::SetItemText这个函数会处理所有限制。