There're certain cases when I really need strncpy() funcitonalty - for example I have a function in a predefined interface that is passed an address of the buffer and the size of the buffer:
HRESULT someFunction( char* buffer, size_t length ); and it is documented that I can copy a null-terminated string there with length no more than length - if it is exactly of length length I don't null-terminate the string and the caller knows that the string ends at either a null character or at length length whichever happens first and it all works.
Of course I will use strncpy() for that
HRESULT someFunction( char* buffer, size_t length ) { const char* toCopy = ... size_t actualLength = strlen( toCopy ); if( actualLength > length ) { return E_UNEXPECTED; // doesn't fit, can't do anything reasonable } strncpy( buffer, toCopy, length ); return S_OK; } Now I have this code and need to migrate it from Visual C++ 7 to Visual C++ 9. I compile it and see a warning that strncpy() is unsafe and I should instead use strncpy_s().
strncpy_s() is designed to always null-terminate the buffer, so I can't use it as a direct replacement in the above scenario. I'll have to return E_UNEXPECTED on strings longer than length - 1 (not length as previously) or it will just fire an invalid parameters error handler once a string is of length or longer or the program will run into undefined behavior.
The solution I applied so far is to just define a _CRT_SECURE_NO_WARNINGS and make the compiler shut up.
is there any way to use strncpy_s() as an actual replacement to strncpy()?