Hello there! This note has its origin in a report received at bug-inetutils. The following test code for snprintf() is a simplyfied detection I have implemented as a warning-only test in Gnu Inetutils. My point is that Linux/glibc and kfreebsd/glibc triggers this warning, but OpenSolaris, OpenIndiana, FreeBSD, OpenBSD, NetBSD, and DragonflyBSD do not! Reading the replacement code for the Gnulib module snprintf, neither would your function, should it undergo the test. In conclusion, this is a case where the native glibc function snprintf() behaves worse than does your replacement.
#define MESSAGE "try a fool" #define WRONG_MESSAGE "fool" char msg[sizeof (MESSAGE)] = "try a "; snprintf (msg, sizeof (msg), "%s%s", msg, WRONG_MESSAGE); if (!strcmp (msg, WRONG_MESSAGE)) printf ("Warning! snprintf got confused!\n"); Observe that `msg' is target, as well as source. POSIX mentions nothing about such a use case, but glibc will produce "fool", whereas all BSD unices as well as OpenSolaris descendants will produce "try a fool". Tacitly, POSIX would probably cry out a statement like "Undefined"! It is my opinion that this discrepancies should at least be documented in 'snprintf.texi', were you not to take matter so far as to include this as some sort of test, after due elaboration. Gnu Inetutils uses legacy code from BSD4.4, where the related use is present and did not cause troubles, but as the recent report submitted to us, the code does produce portability issues when brought to glibc. It has taken a long time to discover this state of affaires, but now it has surfaced! On behalf of Gnu Inetutils, Mats Erik Andersson.