ValidateList
Description
Validate whether a given List object is valid. Not foolproof but will work most of the time. Aborts if provided List is not valid.
Parameters
| Name | Direction | Description |
|---|---|---|
l |
in | Pointer to List object to validate. |
Success
Continue execution, meaning given List object is most probably a valid List.
Failure
abort with an error message.
Usage example (Cross-references)
Usage examples (Cross-references)
- In
List.c:17:
}
ValidateList(list);
clear_list(list, item_size);- In
List.c:34:
}
ValidateList(list);
if (idx > list->length) {- In
List.c:100:
}
ValidateList(list);
if (count == 0) {- In
List.c:182:
}
ValidateList(list);
if (list->length < 2) {- In
List.c:224:
}
ValidateList(list);
GenericListNode *n1 = node_at_list(list, item_size, idx1);- In
List.c:253:
}
ValidateList(list);
u64 i = list->length / 2;- In
List.c:271:
}
ValidateList(list);
if (!count) {- In
List.c:309:
}
ValidateList(list1);
ValidateList(list2);- In
List.c:310:
ValidateList(list1);
ValidateList(list2);
if (list1 == list2) {- In
List.c:337:
}
ValidateList(list);
remove_range_list(list, NULL, item_size, 0, list->length);- In
List.c:348:
}
ValidateList(list);
if (idx >= list->length) {- In
List.c:367:
}
ValidateList(list);
if (idx >= list->length) {- In
List.c:382:
}
ValidateList(list);
GenericListNode *node = list->head;- In
List.c:480:
}
ValidateList(list);
u64 abs_target_idx = nidx + ridx;- In
List.c:522:
}
ValidateList(list);
if (target_idx >= list->length) {- In
List.Init.c:39:
IntList list_d = ListInitWithDeepCopyT(list_d, tracked_copy_init, tracked_copy_deinit, &alloc);
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);- In
List.Init.c:40:
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);- In
List.Init.c:41:
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);- In
List.Init.c:42:
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);
bool result = (ListCopyInit(&list_a) == NULL) && (ListCopyDeinit(&list_a) == NULL) && (ListLen(&list_a) == 0);- In
List.Init.c:72:
IntList list_d = ListInitWithDeepCopyT(list_d, tracked_copy_init, tracked_copy_deinit, &alloc);
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);- In
List.Init.c:73:
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);- In
List.Init.c:74:
ValidateList(&list_a);
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);- In
List.Init.c:75:
ValidateList(&list_b);
ValidateList(&list_c);
ValidateList(&list_d);
bool result = (ListAllocator(&list_a)->retry_limit == 23) && (ListAllocator(&list_b)->retry_limit == 23);
static bool test_validate_corrupt_empty_list_fails(void) {
WriteFmt("Testing ValidateList on corrupt empty list\n");
List(int) list = ListInit(get_test_alloc()); list.head = (void *)1;
MAGIC_MARK_DIRTY(&list);
ValidateList(&list);
return false;
static bool test_validate_null_list_fails(void) {
WriteFmt("Testing ValidateList on NULL list\n");
ValidateList(NULL); WriteFmt("Testing ValidateList on NULL list\n");
ValidateList(NULL);
return false;
}
static bool test_validate_invalid_magic_fails(void) {
WriteFmt("Testing ValidateList on invalid magic\n");
List(int) list = ListInit(get_test_alloc()); // uninitialised-handle path.
list.__magic = 0;
ValidateList(&list);
return false;
static bool test_validate_corrupt_nonempty_list_fails(void) {
WriteFmt("Testing ValidateList on corrupt non-empty list\n");
GenericListNode node = {0}; g->tail = NULL;
MAGIC_MARK_DIRTY(&list);
ValidateList(&list);
return false;
static bool test_validate_nonempty_head_null_fails(void) {
WriteFmt("Testing ValidateList on non-empty NULL head\n");
int value = 1; g->length = 1;
MAGIC_MARK_DIRTY(&list);
ValidateList(&list);
return false;
static bool test_validate_head_prev_fails(void) {
WriteFmt("Testing ValidateList on head prev corruption\n");
int value = 1; g->length = 1;
MAGIC_MARK_DIRTY(&list);
ValidateList(&list);
return false;
static bool test_validate_tail_next_fails(void) {
WriteFmt("Testing ValidateList on tail next corruption\n");
int value = 1; g->length = 1;
MAGIC_MARK_DIRTY(&list);
ValidateList(&list);
return false;- In
List.Type.c:15:
IntList list = ListInit(&alloc);
ValidateList(&list);
// intentional bypass: __magic is the private sentinel ValidateList
- In
Foreach.h:35:
#define ListForeach(l, var) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->head)) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodeNext(UNPL(node))) \- In
Foreach.h:69:
#define ListForeachPtr(l, var) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->head)) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodeNext(UNPL(node))) \- In
Foreach.h:102:
#define ListForeachReverse(l, var) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->tail)) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodePrev(UNPL(node))) \- In
Foreach.h:136:
#define ListForeachPtrReverse(l, var) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->tail)) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodePrev(UNPL(node))) \- In
Foreach.h:173:
#define ListForeachInRange(l, var, start, end) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodeNext(UNPL(node))) \- In
Foreach.h:208:
#define ListForeachPtrInRange(l, var, start, end) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodeNext(UNPL(node))) \- In
Foreach.h:244:
#define ListForeachReverseInRange(l, var, start, end) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodePrev(UNPL(node))) \- In
Foreach.h:282:
#define ListForeachPtrReverseInRange(l, var, start, end) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail) \
for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node); \
UNPL(node) = ListNodePrev(UNPL(node))) \- In
Foreach.h:323:
#define ListForeachIdx(l, var, idx) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head) \
for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL) \
for (u64 idx = 0, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; idx < UNPL(pl)->length; \- In
Foreach.h:367:
#define ListForeachPtrIdx(l, var, idx) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head) \
for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL) \
for (u64 idx = 0, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; idx < UNPL(pl)->length; \- In
Foreach.h:408:
#define ListForeachReverseIdx(l, var, idx) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail && UNPL(pl)->length > 0) \
for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL) \
for (u64 idx = UNPL(pl)->length - 1, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; \- In
Foreach.h:453:
#define ListForeachPtrReverseIdx(l, var, idx) \
for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL) \
if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail && UNPL(pl)->length > 0) \
for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL) \
for (u64 idx = UNPL(pl)->length - 1, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; \- In
Insert.h:34:
///
#define ListInsertL(l, lval, idx) \
(ValidateList(l), \
CHECK_TYPE_EQUIVALENCE(TYPE_OF(lval), LIST_DATA_TYPE(l)), \
list_insert_one_l(GENERIC_LIST(l), &LVAL_AS(LIST_DATA_TYPE(l), lval), &(lval), sizeof(LIST_DATA_TYPE(l)), (idx)))- In
Insert.h:54:
///
#define ListInsertR(l, rval, idx) \
(ValidateList(l), \
CHECK_TYPE_CONVERTIBLE(LIST_DATA_TYPE(l), rval), \
list_insert_one_r(GENERIC_LIST(l), &LVAL_AS(LIST_DATA_TYPE(l), rval), sizeof(LIST_DATA_TYPE(l)), (idx)))- In
Insert.h:182:
///
#define ListPushArrL(l, arr, count) \
(ValidateList(l), \
CHECK_TYPE_EQUIVALENCE(TYPE_OF(*(arr)), LIST_DATA_TYPE(l)), \
list_insert_range_l(GENERIC_LIST(l), (void *)(arr), sizeof(LIST_DATA_TYPE(l)), (count)))- In
Insert.h:198:
///
#define ListPushArrR(l, arr, count) \
(ValidateList(l), \
CHECK_TYPE_CONVERTIBLE(const LIST_DATA_TYPE(l) *, arr), \
list_insert_range_r(GENERIC_LIST(l), (const void *)(arr), sizeof(LIST_DATA_TYPE(l)), (count)))- In
Insert.h:240:
///
#define ListMergeL(l, l2) \
(ValidateList(l), \
ValidateList(l2), \
CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)), \- In
Insert.h:241:
#define ListMergeL(l, l2) \
(ValidateList(l), \
ValidateList(l2), \
CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)), \
list_merge_l(GENERIC_LIST(l), GENERIC_LIST(l2), sizeof(LIST_DATA_TYPE(l))))- In
Insert.h:256:
///
#define ListMergeR(l, l2) \
(ValidateList(l), \
ValidateList(l2), \
CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)), \- In
Insert.h:257:
#define ListMergeR(l, l2) \
(ValidateList(l), \
ValidateList(l2), \
CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)), \
list_merge_r(GENERIC_LIST(l), GENERIC_LIST(l2), sizeof(LIST_DATA_TYPE(l))))
Last updated on