strncpy(&data->m_bin->data,versionStr,data->m_bin->sizeData);
接线员在address of
我看来很可疑。我希望是这样的:
strncpy(data->m_bin->data,versionStr,data->m_bin->sizeData);
或许:
strncpy(&data->m_bin->data[0],versionStr,data->m_bin->sizeData);
如何确保__strncpy_chk()
以正确的 s1 长度调用?
好吧,你本身不能。这是FORTIFY_SOURCE
对象大小检查的一部分,当编译器可以推断时使用目标缓冲区大小。
data
假设是一个 size 数组,您可能会执行以下操作sizeData
。
/* avoid undefined behavior */
ASSERT(data->m_bin->data != NULL);
ASSERT(versionStr != NULL);
ASSERT(data->m_bin->sizeData > 0);
size_t l1 = data->m_bin->sizeData;
size_t l2 = strlen(versionStr);
/* min function */
size_t len = l1 < l2 ? l1 : l2;
/* if versionStr is shorter than len, then data will be backfilled */
strncpy(data->m_bin->data, versionStr, len);
/* NULL terminate, even if it truncates */
data->m_bin->data[data->m_bin->sizeData-1] = '\0';
您可能应该使用-Wall
. 我怀疑你应该得到一个使用address of
操作员。