Discussion with David confirmed that adios()'s de facto contract with
the caller is that it won't return. Document that, and add an abort(3)
to ensure it won't occur. Better that than return and blunder on until
a SEGV or corruption later.
/* adios calls advertise() with no tail to print fmt, and perhaps what,
* to stderr, and "ends" the program with an error exit status. The
* route to exit is via the done function pointer and may not be
/* adios calls advertise() with no tail to print fmt, and perhaps what,
* to stderr, and "ends" the program with an error exit status. The
* route to exit is via the done function pointer and may not be
+ * straightforward, e.g. longjmp(3), but it must not return to adios().
+ * If it does then it's a bug and adios() will abort(3) as callers do
+ * not expect execution to continue. */
void
adios (const char *what, const char *fmt, ...)
{
void
adios (const char *what, const char *fmt, ...)
{
va_start(ap, fmt);
advertise (what, NULL, fmt, ap);
va_end(ap);
va_start(ap, fmt);
advertise (what, NULL, fmt, ap);
va_end(ap);
- /* done(), by default, calls exit(). So this function, with that
- default, will never return. */