e2fsck: clean up assertions in dict.c

The C preprocessing symbol NDEBUG is also defined (differently) by
Android's build files, and this was causing compilation failures.  So
change assert() to dict_assert() and manually define it instead of
relying on the NDEBUG and <assert.h> semantics.

Also make sure the necessary debugging functions are available is
DICT_NODEBUG is not defined, so that dict.c will correctly build with
and without DICT_NODEBUG.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
debian
Theodore Ts'o 2015-02-28 01:07:34 -05:00
parent 52a06740ef
commit c379cdc334
1 changed files with 69 additions and 60 deletions

View File

@ -18,7 +18,7 @@
* $Name: kazlib_1_20 $
*/
#define NDEBUG
#define DICT_NODEBUG
#ifdef __GNUC__
#define EXT2FS_ATTR(x) __attribute__(x)
@ -29,7 +29,12 @@
#include "config.h"
#include <stdlib.h>
#include <stddef.h>
#ifdef DICT_NODEBUG
#define dict_assert(x)
#else
#include <assert.h>
#define dict_assert(x) assert(x)
#endif
#define DICT_IMPLEMENTATION
#include "dict.h"
@ -97,7 +102,7 @@ static void rotate_left(dnode_t *upper)
if (upper == upparent->left) {
upparent->left = lower;
} else {
assert (upper == upparent->right);
dict_assert (upper == upparent->right);
upparent->right = lower;
}
@ -123,7 +128,7 @@ static void rotate_right(dnode_t *upper)
if (upper == upparent->right) {
upparent->right = lower;
} else {
assert (upper == upparent->left);
dict_assert (upper == upparent->left);
upparent->left = lower;
}
@ -153,7 +158,7 @@ static void free_nodes(dict_t *dict, dnode_t *node, dnode_t *nil)
* or lower or equal if duplicates are allowed. This function is used for
* debugging purposes.
*/
#ifndef NDEBUG
#ifndef DICT_NODEBUG
static int verify_bintree(dict_t *dict)
{
dnode_t *first, *next;
@ -281,8 +286,8 @@ dict_t *dict_create(dictcount_t maxcount, dict_comp_t comp)
void dict_set_allocator(dict_t *dict, dnode_alloc_t al,
dnode_free_t fr, void *context)
{
assert (dict_count(dict) == 0);
assert ((al == NULL && fr == NULL) || (al != NULL && fr != NULL));
dict_assert (dict_count(dict) == 0);
dict_assert ((al == NULL && fr == NULL) || (al != NULL && fr != NULL));
dict->allocnode = al ? al : dnode_alloc;
dict->freenode = fr ? fr : dnode_free;
@ -297,7 +302,7 @@ void dict_set_allocator(dict_t *dict, dnode_alloc_t al,
void dict_destroy(dict_t *dict)
{
assert (dict_isempty(dict));
dict_assert (dict_isempty(dict));
free(dict);
}
#endif
@ -323,7 +328,7 @@ void dict_free_nodes(dict_t *dict)
void dict_free(dict_t *dict)
{
#ifdef KAZLIB_OBSOLESCENT_DEBUG
assert ("call to obsolescent function dict_free()" && 0);
dict_assert ("call to obsolescent function dict_free()" && 0);
#endif
dict_free_nodes(dict);
}
@ -368,7 +373,7 @@ void dict_init_like(dict_t *dict, const dict_t *template)
dict->nilnode.color = dnode_black;
dict->dupes = template->dupes;
assert (dict_similar(dict, template));
dict_assert (dict_similar(dict, template));
}
/*
@ -381,8 +386,9 @@ static void dict_clear(dict_t *dict)
dict->nilnode.left = &dict->nilnode;
dict->nilnode.right = &dict->nilnode;
dict->nilnode.parent = &dict->nilnode;
assert (dict->nilnode.color == dnode_black);
dict_assert (dict->nilnode.color == dnode_black);
}
#endif /* E2FSCK_NOTUSED */
/*
@ -391,10 +397,9 @@ static void dict_clear(dict_t *dict)
* this function succeeds doesn't mean that the tree is not corrupt. Certain
* corruptions in the tree may simply cause undefined behavior.
*/
#ifndef DICT_NODEBUG
int dict_verify(dict_t *dict)
{
#ifndef NDEBUG
dnode_t *nil = dict_nil(dict), *root = dict_root(dict);
/* check that the sentinel node and root node are black */
@ -415,15 +420,15 @@ int dict_verify(dict_t *dict)
return 0;
if (verify_node_count(nil, root) != dict_count(dict))
return 0;
#endif
return 1;
}
#endif /* DICT_NODEBUG */
#ifdef E2FSCK_NOTUSED
/*
* Determine whether two dictionaries are similar: have the same comparison and
* allocator functions, and same status as to whether duplicates are allowed.
*/
int dict_similar(const dict_t *left, const dict_t *right)
{
if (left->compare != right->compare)
@ -567,9 +572,9 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)
node->key = key;
assert (!dict_isfull(dict));
assert (!dict_contains(dict, node));
assert (!dnode_is_in_a_dict(node));
dict_assert (!dict_isfull(dict));
dict_assert (!dict_contains(dict, node));
dict_assert (!dnode_is_in_a_dict(node));
/* basic binary tree insert */
@ -577,14 +582,14 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)
parent = where;
result = dict->compare(key, where->key);
/* trap attempts at duplicate key insertion unless it's explicitly allowed */
assert (dict->dupes || result != 0);
dict_assert (dict->dupes || result != 0);
if (result < 0)
where = where->left;
else
where = where->right;
}
assert (where == nil);
dict_assert (where == nil);
if (result < 0)
parent->left = node;
@ -615,7 +620,7 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)
if (node == parent->right) {
rotate_left(parent);
parent = node;
assert (grandpa == parent->parent);
dict_assert (grandpa == parent->parent);
/* rotation between parent and child preserves grandpa */
}
parent->color = dnode_black;
@ -635,7 +640,7 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)
if (node == parent->left) {
rotate_right(parent);
parent = node;
assert (grandpa == parent->parent);
dict_assert (grandpa == parent->parent);
}
parent->color = dnode_black;
grandpa->color = dnode_red;
@ -647,7 +652,7 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)
dict_root(dict)->color = dnode_black;
assert (dict_verify(dict));
dict_assert (dict_verify(dict));
}
#ifdef E2FSCK_NOTUSED
@ -663,8 +668,8 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
/* basic deletion */
assert (!dict_isempty(dict));
assert (dict_contains(dict, delete));
dict_assert (!dict_isempty(dict));
dict_assert (dict_contains(dict, delete));
/*
* If the node being deleted has two children, then we replace it with its
@ -683,9 +688,9 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
dnode_t *nextparent = next->parent;
dnode_color_t nextcolor = next->color;
assert (next != nil);
assert (next->parent != nil);
assert (next->left == nil);
dict_assert (next != nil);
dict_assert (next->parent != nil);
dict_assert (next->left == nil);
/*
* First, splice out the successor from the tree completely, by
@ -698,7 +703,7 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
if (nextparent->left == next) {
nextparent->left = child;
} else {
assert (nextparent->right == next);
dict_assert (nextparent->right == next);
nextparent->right = child;
}
@ -718,13 +723,13 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
if (delparent->left == delete) {
delparent->left = next;
} else {
assert (delparent->right == delete);
dict_assert (delparent->right == delete);
delparent->right = next;
}
} else {
assert (delete != nil);
assert (delete->left == nil || delete->right == nil);
dict_assert (delete != nil);
dict_assert (delete->left == nil || delete->right == nil);
child = (delete->left != nil) ? delete->left : delete->right;
@ -733,7 +738,7 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
if (delete == delparent->left) {
delparent->left = child;
} else {
assert (delete == delparent->right);
dict_assert (delete == delparent->right);
delparent->right = child;
}
}
@ -744,7 +749,7 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
dict->nodecount--;
assert (verify_bintree(dict));
dict_assert (verify_bintree(dict));
/* red-black adjustments */
@ -757,13 +762,13 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
parent = child->parent;
if (child == parent->left) {
sister = parent->right;
assert (sister != nil);
dict_assert (sister != nil);
if (sister->color == dnode_red) {
sister->color = dnode_black;
parent->color = dnode_red;
rotate_left(parent);
sister = parent->right;
assert (sister != nil);
dict_assert (sister != nil);
}
if (sister->left->color == dnode_black
&& sister->right->color == dnode_black) {
@ -771,12 +776,12 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
child = parent;
} else {
if (sister->right->color == dnode_black) {
assert (sister->left->color == dnode_red);
dict_assert (sister->left->color == dnode_red);
sister->left->color = dnode_black;
sister->color = dnode_red;
rotate_right(sister);
sister = parent->right;
assert (sister != nil);
dict_assert (sister != nil);
}
sister->color = parent->color;
sister->right->color = dnode_black;
@ -785,15 +790,15 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
break;
}
} else { /* symmetric case: child == child->parent->right */
assert (child == parent->right);
dict_assert (child == parent->right);
sister = parent->left;
assert (sister != nil);
dict_assert (sister != nil);
if (sister->color == dnode_red) {
sister->color = dnode_black;
parent->color = dnode_red;
rotate_right(parent);
sister = parent->left;
assert (sister != nil);
dict_assert (sister != nil);
}
if (sister->right->color == dnode_black
&& sister->left->color == dnode_black) {
@ -801,12 +806,12 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
child = parent;
} else {
if (sister->left->color == dnode_black) {
assert (sister->right->color == dnode_red);
dict_assert (sister->right->color == dnode_red);
sister->right->color = dnode_black;
sister->color = dnode_red;
rotate_left(sister);
sister = parent->left;
assert (sister != nil);
dict_assert (sister != nil);
}
sister->color = parent->color;
sister->left->color = dnode_black;
@ -821,7 +826,7 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)
dict_root(dict)->color = dnode_black;
}
assert (dict_verify(dict));
dict_assert (dict_verify(dict));
return delete;
}
@ -1003,7 +1008,7 @@ dnode_t *dnode_init(dnode_t *dnode, void *data)
void dnode_destroy(dnode_t *dnode)
{
assert (!dnode_is_in_a_dict(dnode));
dict_assert (!dnode_is_in_a_dict(dnode));
free(dnode);
}
@ -1022,12 +1027,16 @@ void dnode_put(dnode_t *dnode, void *data)
{
dnode->data = data;
}
#endif
#ifndef DICT_NODEBUG
int dnode_is_in_a_dict(dnode_t *dnode)
{
return (dnode->parent && dnode->left && dnode->right);
}
#endif
#ifdef E2FSCK_NOTUSED
void dict_process(dict_t *dict, void *context, dnode_process_t function)
{
dnode_t *node = dict_first(dict), *next;
@ -1035,7 +1044,7 @@ void dict_process(dict_t *dict, void *context, dnode_process_t function)
while (node != NULL) {
/* check for callback function deleting */
/* the next node from under us */
assert (dict_contains(dict, node));
dict_assert (dict_contains(dict, node));
next = dict_next(dict, node);
function(dict, node, context);
node = next;
@ -1051,7 +1060,7 @@ static void load_begin_internal(dict_load_t *load, dict_t *dict)
void dict_load_begin(dict_load_t *load, dict_t *dict)
{
assert (dict_isempty(dict));
dict_assert (dict_isempty(dict));
load_begin_internal(load, dict);
}
@ -1060,15 +1069,15 @@ void dict_load_next(dict_load_t *load, dnode_t *newnode, const void *key)
dict_t *dict = load->dictptr;
dnode_t *nil = &load->nilnode;
assert (!dnode_is_in_a_dict(newnode));
assert (dict->nodecount < dict->maxcount);
dict_assert (!dnode_is_in_a_dict(newnode));
dict_assert (dict->nodecount < dict->maxcount);
#ifndef NDEBUG
#ifndef DICT_NODEBUG
if (dict->nodecount > 0) {
if (dict->dupes)
assert (dict->compare(nil->left->key, key) <= 0);
dict_assert (dict->compare(nil->left->key, key) <= 0);
else
assert (dict->compare(nil->left->key, key) < 0);
dict_assert (dict->compare(nil->left->key, key) < 0);
}
#endif
@ -1089,7 +1098,7 @@ void dict_load_end(dict_load_t *load)
dictcount_t botrowcount;
unsigned baselevel = 0, level = 0, i;
assert (dnode_red == 0 && dnode_black == 1);
dict_assert (dnode_red == 0 && dnode_black == 1);
while (fullcount >= nodecount && fullcount)
fullcount >>= 1;
@ -1100,8 +1109,8 @@ void dict_load_end(dict_load_t *load)
next = curr->left;
if (complete == NULL && botrowcount-- == 0) {
assert (baselevel == 0);
assert (level == 0);
dict_assert (baselevel == 0);
dict_assert (level == 0);
baselevel = level = 1;
complete = tree[0];
@ -1123,7 +1132,7 @@ void dict_load_end(dict_load_t *load)
curr->color = level % 2;
complete = curr;
assert (level == baselevel);
dict_assert (level == baselevel);
while (tree[level] != 0) {
tree[level]->right = complete;
complete->parent = tree[level];
@ -1157,7 +1166,7 @@ void dict_load_end(dict_load_t *load)
complete->color = dnode_black;
dict_root(dict) = complete;
assert (dict_verify(dict));
dict_assert (dict_verify(dict));
}
void dict_merge(dict_t *dest, dict_t *source)
@ -1165,7 +1174,7 @@ void dict_merge(dict_t *dest, dict_t *source)
dict_load_t load;
dnode_t *leftnode = dict_first(dest), *rightnode = dict_first(source);
assert (dict_similar(dest, source));
dict_assert (dict_similar(dest, source));
if (source == dest)
return;
@ -1184,14 +1193,14 @@ void dict_merge(dict_t *dest, dict_t *source)
} else if (rightnode != NULL) {
goto copyright;
} else {
assert (leftnode == NULL && rightnode == NULL);
dict_assert (leftnode == NULL && rightnode == NULL);
break;
}
copyleft:
{
dnode_t *next = dict_next(dest, leftnode);
#ifndef NDEBUG
#ifndef DICT_NODEBUG
leftnode->left = NULL; /* suppress assertion in dict_load_next */
#endif
dict_load_next(&load, leftnode, leftnode->key);
@ -1202,7 +1211,7 @@ void dict_merge(dict_t *dest, dict_t *source)
copyright:
{
dnode_t *next = dict_next(source, rightnode);
#ifndef NDEBUG
#ifndef DICT_NODEBUG
rightnode->left = NULL;
#endif
dict_load_next(&load, rightnode, rightnode->key);