Local analysis can now easily find out what's up. Before,
whole-program analysis was required. The Clang Static Analyzer
complained about code that is actually fine.
* Return EXPR != 0.
* Usage: if (CANT_HAPPEN(...)) <recovery code>;
*/
* Return EXPR != 0.
* Usage: if (CANT_HAPPEN(...)) <recovery code>;
*/
-#define CANT_HAPPEN(expr) ((expr) ? oops(#expr, __FILE__, __LINE__) : 0)
+#define CANT_HAPPEN(expr) ((expr) ? oops(#expr, __FILE__, __LINE__), 1 : 0)
/*
* Report internal error.
* Usage: CANT_REACH(); <recovery code>;
*/
/*
* Report internal error.
* Usage: CANT_REACH(); <recovery code>;
*/
-#define CANT_REACH() (void)oops(NULL, __FILE__, __LINE__)
+#define CANT_REACH() oops(NULL, __FILE__, __LINE__)
-extern int oops(char *, char *, int);
+extern void oops(char *, char *, int);
extern void (*oops_handler)(void);
void exit_nomem(void) ATTRIBUTE((noreturn));
extern void (*oops_handler)(void);
void exit_nomem(void) ATTRIBUTE((noreturn));
- * Log internal error MSG occured in FILE:LINE.
- * Call oops handler, and if it returns, return 1.
- * Oops handler defaults to abort().
+ * Log internal error MSG occured in FILE:LINE, call oops handler.
oops(char *msg, char *file, int line)
{
logerror("Oops: %s in %s:%d", msg ? msg : "bug", file, line);
oops_handler();
oops(char *msg, char *file, int line)
{
logerror("Oops: %s in %s:%d", msg ? msg : "bug", file, line);
oops_handler();