Новое в cppcheck. Не удалось выяснить, как решить эту проблему (предупреждение cppcheck). любая помощь будет оценена.
if (!call_initialized)
{ char id1[16];
char id1[16];
char* dummy_char_ptr = inet_ntoa(*((in_addr*)&source_ip));
std::strncpy(id1, dummy_char_ptr, 16);
dummy_char_ptr=inet_ntoa(*((in_addr*)&destination_ip));
std::strncpy(id2, dummy_char_ptr, 16);
dummy_char_ptr=NULL;
std::cerr << id1 << " -----> " << id2 << std::endl;
return 0;
}
ошибка (предупреждение) — буфер ‘id2’ не может заканчиваться нулем после вызова strncpy ().
Не использовать strncpy
(если вы действительно не знаете, что делаете).
strncpy(dst, src, n)
всегда пишет точно n
байт. Если src
не имеет NUL
байт в своем первом n
байтов нет NUL
Байт будет записан в dst
Таким образом, вы можете превратить допустимую NUL-оканчивающуюся строку в неопределенную строку (вот почему вы получаете предупреждение). Если src
короче чем n
байт, strncpy
добавлю NUL
байтов до конца, что обычно не нужно.
Лично я бы использовал strdup
(и не забудьте free
получившаяся копия, когда я с ней закончу), потому что так проще. strdup
является расширением Posix для стандартной библиотеки C, но ее легко написать, если она вам нужна, и она существует на большинстве платформ (как _strdup
в Windows, iirc). В качестве альтернативы, вы можете strncpy на один байт меньше, чем размер вашего буфера, а затем добавить NUL в конце, или вы можете просто проверить длину исходной строки с помощью strlen
и потерпеть неудачу, если это слишком долго.