在 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这个函数会处理所有限制。
为了修复缓冲区溢出 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这个函数会处理所有限制。