3

New to cppcheck. Couldn't figure out how to solve this issue (cppcheck warning). any help would be appreciated.

 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;
   }

error(warning) - The buffer 'id2' may not be zero-terminated after the call to strncpy().

2

1 Answer 1

5

Don't use strncpy (unless you really know what you're doing).

strncpy(dst, src, n) always writes exactly n bytes. If src does not have a NUL byte in its first n bytes, no NUL byte will be written to dst, so you can turn a valid NUL-terminated string into an unterminated string (which is why you get the warning). If src is shorter than n bytes, strncpy will add NUL bytes to the end, which is usually unnecessary.

Personally, I would use strdup (and remember to free the resulting copy when I'm done with it), because it is easier. strdup is a Posix extension to standard C library, but it's easy to write if you need it, and it exists on most platforms (as _strdup on Windows, iirc). Alternatively, you could strncpy one fewer byte than the size of your buffer, and then add a NUL at the end, or you could just check the length of the source string with strlen and fail if it is too long.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.