/* Check that CCAN_LIST_DEBUG works */ #include #include #include #include #include #include /* We don't actually want it to exit... */ static jmp_buf aborted; #define abort() longjmp(aborted, 1) #define fprintf my_fprintf static char printf_buffer[1000]; static int my_fprintf(FILE *stream, const char *format, ...) { va_list ap; int ret; (void)stream; va_start(ap, format); ret = vsprintf(printf_buffer, format, ap); va_end(ap); return ret; } #define CCAN_LIST_DEBUG 1 #include #include #include int main(void) { struct list_head list; struct list_node n1; char expect[100]; plan_tests(2); /* Empty list. */ list.n.next = &list.n; list.n.prev = &list.n; ok1(list_check(&list, NULL) == &list); /* Bad back ptr */ list.n.prev = &n1; /* Aborting version. */ sprintf(expect, "run-CCAN_LIST_DEBUG.c:51: prev corrupt in node %p (0) of %p\n", &list, &list); if (setjmp(aborted) == 0) { assert(list_empty(&list)); fail("list_empty on empty with bad back ptr didn't fail!"); } else { /* __FILE__ might give full path. */ int prep = strlen(printf_buffer) - strlen(expect); ok1(prep >= 0 && strcmp(printf_buffer + prep, expect) == 0); } return exit_status(); }