mm: Add a bunch of assertions

This commit is contained in:
YAMAMOTO Takashi 2020-02-13 17:06:05 +09:00 committed by patacongo
parent c1a32fb9dd
commit 46ad645efc
6 changed files with 37 additions and 2 deletions

View File

@ -39,6 +39,8 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <assert.h>
#include <nuttx/mm/mm.h> #include <nuttx/mm/mm.h>
/**************************************************************************** /****************************************************************************
@ -59,6 +61,9 @@ void mm_addfreechunk(FAR struct mm_heap_s *heap, FAR struct mm_freenode_s *node)
FAR struct mm_freenode_s *next; FAR struct mm_freenode_s *next;
FAR struct mm_freenode_s *prev; FAR struct mm_freenode_s *prev;
DEBUGASSERT(node->size >= SIZEOF_MM_FREENODE);
DEBUGASSERT((node->preceding & MM_ALLOC_BIT) == 0);
/* Convert the size to a nodelist index */ /* Convert the size to a nodelist index */
int ndx = mm_size2ndx(node->size); int ndx = mm_size2ndx(node->size);

View File

@ -77,6 +77,7 @@ void mm_free(FAR struct mm_heap_s *heap, FAR void *mem)
*/ */
mm_takesemaphore(heap); mm_takesemaphore(heap);
DEBUGASSERT(mm_heapmember(heap, mem));
/* Map the memory chunk into a free node */ /* Map the memory chunk into a free node */

View File

@ -170,6 +170,8 @@ void mm_initialize(FAR struct mm_heap_s *heap, FAR void *heapstart,
CHECK_ALLOCNODE_SIZE; CHECK_ALLOCNODE_SIZE;
CHECK_FREENODE_SIZE; CHECK_FREENODE_SIZE;
#endif #endif
DEBUGASSERT(MM_MIN_CHUNK >= SIZEOF_MM_FREENODE);
DEBUGASSERT(MM_MIN_CHUNK >= SIZEOF_MM_ALLOCNODE);
/* Set up global variables */ /* Set up global variables */

View File

@ -60,6 +60,7 @@
int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info) int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info)
{ {
FAR struct mm_allocnode_s *node; FAR struct mm_allocnode_s *node;
FAR struct mm_allocnode_s *prev;
size_t mxordblk = 0; size_t mxordblk = 0;
int ordblks = 0; /* Number of non-inuse chunks */ int ordblks = 0; /* Number of non-inuse chunks */
size_t uordblks = 0; /* Total allocated space */ size_t uordblks = 0; /* Total allocated space */
@ -84,9 +85,11 @@ int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info)
mm_takesemaphore(heap); mm_takesemaphore(heap);
for (node = heap->mm_heapstart[region]; for (prev = NULL, node = heap->mm_heapstart[region];
node < heap->mm_heapend[region]; node < heap->mm_heapend[region];
node = (FAR struct mm_allocnode_s *)((FAR char *)node + node->size)) prev = node,
node = (FAR struct mm_allocnode_s *)
((FAR char *)node + node->size))
{ {
minfo("region=%d node=%p size=%u preceding=%u (%c)\n", minfo("region=%d node=%p size=%u preceding=%u (%c)\n",
region, node, (unsigned int)node->size, region, node, (unsigned int)node->size,
@ -97,10 +100,21 @@ int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info)
if ((node->preceding & MM_ALLOC_BIT) != 0) if ((node->preceding & MM_ALLOC_BIT) != 0)
{ {
DEBUGASSERT(node->size >= SIZEOF_MM_ALLOCNODE);
uordblks += node->size; uordblks += node->size;
} }
else else
{ {
FAR struct mm_freenode_s *fnode;
DEBUGASSERT(node->size >= SIZEOF_MM_FREENODE);
fnode = (FAR void *)node;
DEBUGASSERT(fnode->blink->flink == fnode);
DEBUGASSERT(fnode->blink->size <= fnode->size);
DEBUGASSERT(fnode->flink == NULL ||
fnode->flink->blink == fnode);
DEBUGASSERT(fnode->flink == NULL ||
fnode->flink->size == 0 ||
fnode->flink->size >= fnode->size);
ordblks++; ordblks++;
fordblks += node->size; fordblks += node->size;
if (node->size > mxordblk) if (node->size > mxordblk)
@ -108,6 +122,9 @@ int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info)
mxordblk = node->size; mxordblk = node->size;
} }
} }
DEBUGASSERT(prev == NULL ||
prev->size == (node->preceding & ~MM_ALLOC_BIT));
} }
minfo("region=%d node=%p heapend=%p\n", minfo("region=%d node=%p heapend=%p\n",

View File

@ -89,6 +89,8 @@ FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size)
alignsize = MM_ALIGN_UP(size + SIZEOF_MM_ALLOCNODE); alignsize = MM_ALIGN_UP(size + SIZEOF_MM_ALLOCNODE);
DEBUGASSERT(alignsize >= size); /* Check for integer overflow */ DEBUGASSERT(alignsize >= size); /* Check for integer overflow */
DEBUGASSERT(alignsize >= MM_MIN_CHUNK);
DEBUGASSERT(alignsize >= SIZEOF_MM_FREENODE);
/* We need to hold the MM semaphore while we muck with the nodelist. */ /* We need to hold the MM semaphore while we muck with the nodelist. */
@ -117,6 +119,9 @@ FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size)
for (node = heap->mm_nodelist[ndx].flink; for (node = heap->mm_nodelist[ndx].flink;
node && node->size < alignsize; node && node->size < alignsize;
node = node->flink); node = node->flink);
{
DEBUGASSERT(node->blink->flink == node);
}
/* If we found a node with non-zero size, then this is one to use. Since /* If we found a node with non-zero size, then this is one to use. Since
* the list is ordered, we know that is must be best fitting chunk * the list is ordered, we know that is must be best fitting chunk
@ -183,6 +188,7 @@ FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size)
ret = (void *)((FAR char *)node + SIZEOF_MM_ALLOCNODE); ret = (void *)((FAR char *)node + SIZEOF_MM_ALLOCNODE);
} }
DEBUGASSERT(ret == NULL || mm_heapmember(heap, ret));
mm_givesemaphore(heap); mm_givesemaphore(heap);
#ifdef CONFIG_MM_FILL_ALLOCATIONS #ifdef CONFIG_MM_FILL_ALLOCATIONS

View File

@ -114,6 +114,8 @@ FAR void *mm_realloc(FAR struct mm_heap_s *heap, FAR void *oldmem,
/* We need to hold the MM semaphore while we muck with the nodelist. */ /* We need to hold the MM semaphore while we muck with the nodelist. */
mm_takesemaphore(heap); mm_takesemaphore(heap);
DEBUGASSERT(oldnode->preceding & MM_ALLOC_BIT);
DEBUGASSERT(mm_heapmember(heap, oldmem));
/* Check if this is a request to reduce the size of the allocation. */ /* Check if this is a request to reduce the size of the allocation. */
@ -248,6 +250,7 @@ FAR void *mm_realloc(FAR struct mm_heap_s *heap, FAR void *oldmem,
*/ */
prev->size -= takeprev; prev->size -= takeprev;
DEBUGASSERT(prev->size >= SIZEOF_MM_FREENODE);
newnode->size = oldsize + takeprev; newnode->size = oldsize + takeprev;
newnode->preceding = prev->size | MM_ALLOC_BIT; newnode->preceding = prev->size | MM_ALLOC_BIT;
next->preceding = newnode->size | next->preceding = newnode->size |
@ -319,6 +322,7 @@ FAR void *mm_realloc(FAR struct mm_heap_s *heap, FAR void *oldmem,
*/ */
newnode->size = nextsize - takenext; newnode->size = nextsize - takenext;
DEBUGASSERT(newnode->size >= SIZEOF_MM_FREENODE);
newnode->preceding = oldnode->size; newnode->preceding = oldnode->size;
andbeyond->preceding = newnode->size | andbeyond->preceding = newnode->size |
(andbeyond->preceding & MM_ALLOC_BIT); (andbeyond->preceding & MM_ALLOC_BIT);