]> diplodocus.org Git - nmh/commitdiff
Document that adios() does not return. abort() ensures it won't.
authorRalph Corderoy <ralph@inputplus.co.uk>
Sat, 10 Dec 2016 14:19:43 +0000 (14:19 +0000)
committerRalph Corderoy <ralph@inputplus.co.uk>
Sat, 10 Dec 2016 14:19:43 +0000 (14:19 +0000)
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.

sbr/error.c

index 1796736..b33eae5 100644 (file)
@@ -29,7 +29,9 @@ advise (const char *what, const char *fmt, ...)
 /* 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. */
+ * 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, ...)
 {
@@ -38,9 +40,8 @@ adios (const char *what, const char *fmt, ...)
     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. */
     done (1);
+    abort();
 }