Is sprintf(buffer, “%s […]”, buffer, […]) safe?

From the glibc sprintf() documentation:

The behavior of this function is
undefined if copying takes place
between objects that overlap—for
example, if s is also given as an
argument to be printed under control
of the ‘%s’ conversion.

It may be safe in a particular implementation; but you could not count on it being portable.

I’m not sure that your proposal would be safe in all cases either. You could still be overlapping buffers. It’s late and my wife is buggin me but I think that you could still have the case where you want to use the original string again in the concatenated string and are overwriting the null character and so the sprintf implementation might not know where the re-used string ends.

You might just want to stick with a snprint() to a temp buffer, then strncat() it onto the original buffer.

Leave a Comment