How does strcpy_s work?

Joey picture Joey · Apr 26, 2014 · Viewed 31k times · Source

As we all know, strcpy_s is a safety version of strcpy.

But I wonder how it works ...

let's see some examples.

strpy_s's declaration:
errno_t strcpy_s(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)

eg1

char dest[5];
char* src = "abcdefg";
strcpy_s(dest,5,src);

It will return an assertion.
I think I can understand this, use _SIZE to make sure we can't copy more characters than _SIZE

But.. I can't understand this:

char dest[5];
char* src = "abcdefg";
strcpy_s(dest,10,src);

we can still get a assertion, how did that happened?

ps,error was:

Debug Assertion Failed
expression : (L"Buffer is too small "&&0)


In VS2013

will strcpy_s checks the size of dest inside its body?? and if it's true , how? how to check a pointer like _DEST?

Answer

vsoftco picture vsoftco · May 13, 2014

This is actually how to get the size of a stack array at run time without decaying it to a pointer:

template<typename T, size_t N> 
size_t arrSize(T (&array)[N])  
{
  return N;
}

You send it as a template reference, and the template mechanism deduces the size. So, you can do something like

int myArray[10];
cout << arrSize(myArray); // will display 10

So my guess is that this is how the "safe" MS strcpy_s is checking the sizes. Otherwise, if you pass just a pointer, there is NO STANDARD-COMPLIANT way of getting the size.