Search code examples
cprintfbuffer-overflow

What is the difference between sprintf_s and snprintf?


I encountered this question while writing a program that requires the sprintf function.

In some cases, using the sprintf function can lead to memory overflow and pose a security risk. So, you can use the snprintf or sprintf_s functions, which are used to avoid these risks.

But the definitions of these two functions are the same. So, why do these two functions exist instead of just one?

int sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...);
int snprintf(char *__restrict__ __stream, size_t __n, const char *__restrict__ __format, ...);

In the beginning, I thought that the sprintf_s function was unique to the Windows library, and I also thought that the snprintf function was unique to POSIX. But, in fact, both of these functions are included in the <stdio.h> library.


Solution

  • There are a number of differences between the snprintf and sprintf_s functions, notably in their return values and how they handle errors.

    Return Values (barring errors):

    • snprintf returns the number of characters which would have been written to the buffer if the "size" argument were ignored.

    • sprintf_s returns the number of characters actually written.

    Additional Checks:

    The sprintf_s function also performs checks that snprintf does not, including. The call fails (and returns zero) if any of the following are true:

    1. The %n format specifier is given.
    2. Any of the arguments corresponding to a %s format specifier are null pointers.
    3. The given "size" argument is zero.