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?
Ну, вы не можете per se . Это часть FORTIFY_SOURCE
и проверки размера объекта, и размер буфера назначения используется, когда компилятор может определить его.
Вы могли бы сделать что-то вроде следующего, предполагая, что data
- это массив размером 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
.