|
@@ -11,6 +11,44 @@
|
|
|
#include "util_bug.h"
|
|
|
#include "torlog.h"
|
|
|
#include "backtrace.h"
|
|
|
+#include "container.h"
|
|
|
+
|
|
|
+#ifdef TOR_UNIT_TESTS
|
|
|
+static int n_bugs_to_capture = 0;
|
|
|
+static smartlist_t *bug_messages = NULL;
|
|
|
+#define capturing_bugs() (bug_messages != NULL && n_bugs_to_capture)
|
|
|
+void
|
|
|
+tor_capture_bugs_(int n)
|
|
|
+{
|
|
|
+ tor_end_capture_bugs_();
|
|
|
+ bug_messages = smartlist_new();
|
|
|
+ n_bugs_to_capture = n;
|
|
|
+}
|
|
|
+void
|
|
|
+tor_end_capture_bugs_(void)
|
|
|
+{
|
|
|
+ n_bugs_to_capture = 0;
|
|
|
+ if (!bug_messages)
|
|
|
+ return;
|
|
|
+ SMARTLIST_FOREACH(bug_messages, char *, cp, tor_free(cp));
|
|
|
+ smartlist_free(bug_messages);
|
|
|
+ bug_messages = NULL;
|
|
|
+}
|
|
|
+const smartlist_t *
|
|
|
+tor_get_captured_bug_log_(void)
|
|
|
+{
|
|
|
+ return bug_messages;
|
|
|
+}
|
|
|
+static void
|
|
|
+add_captured_bug(const char *s)
|
|
|
+{
|
|
|
+ --n_bugs_to_capture;
|
|
|
+ smartlist_add(bug_messages, tor_strdup(s));
|
|
|
+}
|
|
|
+#else
|
|
|
+#define capturing_bugs() (0)
|
|
|
+#define add_captured_bug(s) do { } while (0)
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
void
|
|
@@ -36,12 +74,20 @@ tor_bug_occurred_(const char *fname, unsigned int line,
|
|
|
const char *once_str = once ?
|
|
|
" (Future instances of this warning will be silenced.)": "";
|
|
|
if (! expr) {
|
|
|
+ if (capturing_bugs()) {
|
|
|
+ add_captured_bug("This line should not have been reached.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
log_warn(LD_BUG, "%s:%u: %s: This line should not have been reached.%s",
|
|
|
fname, line, func, once_str);
|
|
|
tor_snprintf(buf, sizeof(buf),
|
|
|
"Line unexpectedly reached at %s at %s:%u",
|
|
|
func, fname, line);
|
|
|
} else {
|
|
|
+ if (capturing_bugs()) {
|
|
|
+ add_captured_bug(expr);
|
|
|
+ return;
|
|
|
+ }
|
|
|
log_warn(LD_BUG, "%s:%u: %s: Non-fatal assertion %s failed.%s",
|
|
|
fname, line, func, expr, once_str);
|
|
|
tor_snprintf(buf, sizeof(buf),
|