Add some assertions and coverage exceptions to queue.c (#273)
* Add an LCOV_BRANCH exception for the check that sizeof( StaticQueue_t ) == sizeof( Queue_t )
* Add LCOV_BRANCH coverage exception for a configASSERT on pxQueueSetContainer with a condition that is unreachable.
* Add configASSERTs to alert when invalid parameters are passed into Queue Registry related functions.
* Assert that the semaphore handle passed into xQueueGetMutexHolder is not NULL.
* Correct some typos in queue.c
* Update lexicon.txt
diff --git a/.github/lexicon.txt b/.github/lexicon.txt
index 9ffef9a..800def7 100644
--- a/.github/lexicon.txt
+++ b/.github/lexicon.txt
@@ -1529,6 +1529,7 @@
prvinitialisenewtimer
prvinsertblockintofreelist
prvlockqueue
+prvnotifyqueuesetcontainer
prvportmalloc
prvportresetpic
prvprocesssimulatedinterrupts
@@ -1631,7 +1632,6 @@
pwdtc
pwm
pwmc
-pxtaskcode
pxblock
pxblocktoinsert
pxcallbackfunction
@@ -1688,6 +1688,7 @@
pxpreviouswaketime
pxqueue
pxqueuebuffer
+pxqueuesetcontainer
pxramstack
pxreadycoroutinelists
pxreadytaskslists
@@ -1707,6 +1708,7 @@
pxtagvalue
pxtask
pxtaskbuffer
+pxtaskcode
pxtaskdefinition
pxtaskstatus
pxtaskstatusarray
@@ -2653,7 +2655,6 @@
www
wwwfreertos
wxr
-xtasktodelete
xa
xaa
xaaaa
@@ -3020,6 +3021,7 @@
xtaskswaitingtermination
xtaskswaitingtoreceive
xtaskswaitingtosend
+xtasktodelete
xtasktonotify
xtasktoquery
xtasktoresume
diff --git a/queue.c b/queue.c
index 7ed8e98..6805cd0 100644
--- a/queue.c
+++ b/queue.c
@@ -342,8 +342,10 @@
* variable of type StaticQueue_t or StaticSemaphore_t equals the size of
* the real queue and semaphore structures. */
volatile size_t xSize = sizeof( StaticQueue_t );
- configASSERT( xSize == sizeof( Queue_t ) );
- ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */
+
+ /* This assertion cannot be branch covered in unit tests */
+ configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */
+ ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */
}
#endif /* configASSERT_DEFINED */
@@ -398,7 +400,7 @@
configASSERT( ( uxItemSize == 0 ) || ( uxQueueLength == ( xQueueSizeInBytes / uxItemSize ) ) );
/* Check for addition overflow. */
- configASSERT( ( sizeof( Queue_t ) + xQueueSizeInBytes ) > xQueueSizeInBytes );
+ configASSERT( ( sizeof( Queue_t ) + xQueueSizeInBytes ) > xQueueSizeInBytes );
/* Allocate the queue and storage area. Justification for MISRA
* deviation as follows: pvPortMalloc() always ensures returned memory
@@ -561,6 +563,8 @@
TaskHandle_t pxReturn;
Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore;
+ configASSERT( xSemaphore );
+
/* This function is called by xSemaphoreGetMutexHolder(), and should not
* be called directly. Note: This is a good way of determining if the
* calling task is the mutex holder, but not a good way of determining the
@@ -944,15 +948,15 @@
vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );
/* Unlocking the queue means queue events can effect the
- * event list. It is possible that interrupts occurring now
+ * event list. It is possible that interrupts occurring now
* remove this task from the event list again - but as the
* scheduler is suspended the task will go onto the pending
- * ready last instead of the actual ready list. */
+ * ready list instead of the actual ready list. */
prvUnlockQueue( pxQueue );
/* Resuming the scheduler will move tasks from the pending
* ready list into the ready list - so it is feasible that this
- * task is already in a ready list before it yields - in which
+ * task is already in the ready list before it yields - in which
* case the yield will not cause a context switch unless there
* is also a higher priority task in the pending ready list. */
if( xTaskResumeAll() == pdFALSE )
@@ -1774,7 +1778,7 @@
taskEXIT_CRITICAL();
/* Interrupts and other tasks can send to and receive from the queue
- * now the critical section has been exited. */
+ * now that the critical section has been exited. */
vTaskSuspendAll();
prvLockQueue( pxQueue );
@@ -2723,6 +2727,9 @@
{
UBaseType_t ux;
+ configASSERT( xQueue );
+ configASSERT( pcQueueName );
+
/* See if there is an empty space in the registry. A NULL name denotes
* a free slot. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@@ -2753,6 +2760,8 @@
UBaseType_t ux;
const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
+ configASSERT( xQueue );
+
/* Note there is nothing here to protect against another task adding or
* removing entries from the registry while it is being searched. */
@@ -2781,6 +2790,8 @@
{
UBaseType_t ux;
+ configASSERT( xQueue );
+
/* See if the handle of the queue being unregistered in actually in the
* registry. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@@ -2967,7 +2978,10 @@
/* This function must be called form a critical section. */
- configASSERT( pxQueueSetContainer );
+ /* The following line is not reachable in unit tests because every call
+ * to prvNotifyQueueSetContainer is preceded by a check that
+ * pxQueueSetContainer != NULL */
+ configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */
configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength );
if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength )