2015-04-22 2 views
3

Новое в cppcheck. Не удалось выяснить, как решить эту проблему (cppcheck warning). любая помощь будет оценена по достоинству.cppcheck - terminateStrncpy

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().

+1

см. Http://stackoverflow.com/questions/1453876/why-does-strncpy-not-null-terminate –

+0

http://the-flat-trantor-society.blogspot.com/2012/03/no- strncpy-is-not-safer-strcpy.html –

ответ

2

Не используйте strncpy (если вы действительно не знаете, что делаете).

strncpy(dst, src, n) всегда записывает точно n байт. Если src не имеет байта в его первых n байт, байт NUL будет записан в dst, поэтому вы можете превратить действительную строку с нулевым символом в неисчерпаемую строку (вот почему вы получаете предупреждение). Если src короче n байт, strncpy добавит NUL байт до конца, что обычно не нужно.

Лично я использовал бы strdup (и не забыл free результирующую копию, когда я закончил с ней), потому что это проще. strdup - это расширение Posix для стандартной библиотеки C, но его легко написать, если оно вам нужно, и оно существует на большинстве платформ (как _strdup на Windows, iirc). В качестве альтернативы вы можете strncpy на меньшее количество байтов, чем размер вашего буфера, а затем добавить NUL в конце или просто проверить длину строки источника с strlen и сбой, если он слишком длинный.

+1

благодарит @rici, ценим время и ваше четкое объяснение. –