cppcheck — terminateStrncpy

Новое в 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 ().

3

Решение

Не использовать 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 и потерпеть неудачу, если это слишком долго.

3

Другие решения


По вопросам рекламы [email protected]