I wish to know which of these two options is the more secure one to use:
#define MAXLEN 255 char buff[MAXLEN + 1]
sprintf(buff, "%.*s", MAXLEN, name)
snprintf(buff, MAXLEN, "%s", name)
My understanding is that both are same. Please suggest.
Snprintf is more secure and if the string number overruns the characters, the string is protected in the buffer even if the format is different. It works with n characters and nth location and hence the location of null character is not considered at all. Allocation of null character memory is preserved in sprintf.
Warning: The sprintf function can be dangerous because it can potentially output more characters than can fit in the allocation size of the string s . Remember that the field width given in a conversion specification is only a minimum value.
The sprintf() function facilitates unbounded copying of text, in turn leaving the buffer susceptible to overflow attack.
One main difference between sprintf_s and sprintf is that sprintf_s checks the format string for valid formatting characters, whereas sprintf only checks if the format string or buffer are NULL pointers.
The two expressions you gave are not equivalent: sprintf
takes no argument specifying the maximum number of bytes to write; it simply takes a destination buffer, a format string, and a bunch of arguments. Therefore, it may write more bytes than your buffer has space for, and in so doing write arbitrary code. The %.*s
is not a satisfactory solution because:
strlen
; this is a measure of the number of characters in the string, not its length in memory (i.e. it doesn't count the null terminator).sprintf
version with respect to buffer overflows. With snprintf
, a fixed, clear maximum is set regardless of changes in the format string or input types.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With