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
This commit is contained in:
Paul Bartell 2021-03-05 18:46:49 -08:00 committed by GitHub
parent de19eeb7d3
commit 18d4ba9c07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 10 deletions

6
.github/lexicon.txt vendored
View file

@ -1529,6 +1529,7 @@ prvinitialisenewstreambuffer
prvinitialisenewtimer prvinitialisenewtimer
prvinsertblockintofreelist prvinsertblockintofreelist
prvlockqueue prvlockqueue
prvnotifyqueuesetcontainer
prvportmalloc prvportmalloc
prvportresetpic prvportresetpic
prvprocesssimulatedinterrupts prvprocesssimulatedinterrupts
@ -1631,7 +1632,6 @@ pvyieldevent
pwdtc pwdtc
pwm pwm
pwmc pwmc
pxtaskcode
pxblock pxblock
pxblocktoinsert pxblocktoinsert
pxcallbackfunction pxcallbackfunction
@ -1688,6 +1688,7 @@ pxprevious
pxpreviouswaketime pxpreviouswaketime
pxqueue pxqueue
pxqueuebuffer pxqueuebuffer
pxqueuesetcontainer
pxramstack pxramstack
pxreadycoroutinelists pxreadycoroutinelists
pxreadytaskslists pxreadytaskslists
@ -1707,6 +1708,7 @@ pxstreambuffercreatestatic
pxtagvalue pxtagvalue
pxtask pxtask
pxtaskbuffer pxtaskbuffer
pxtaskcode
pxtaskdefinition pxtaskdefinition
pxtaskstatus pxtaskstatus
pxtaskstatusarray pxtaskstatusarray
@ -2653,7 +2655,6 @@ wu
www www
wwwfreertos wwwfreertos
wxr wxr
xtasktodelete
xa xa
xaa xaa
xaaaa xaaaa
@ -3020,6 +3021,7 @@ xtaskswaitingforbits
xtaskswaitingtermination xtaskswaitingtermination
xtaskswaitingtoreceive xtaskswaitingtoreceive
xtaskswaitingtosend xtaskswaitingtosend
xtasktodelete
xtasktonotify xtasktonotify
xtasktoquery xtasktoquery
xtasktoresume xtasktoresume

24
queue.c
View file

@ -342,7 +342,9 @@ BaseType_t xQueueGenericReset( QueueHandle_t xQueue,
* variable of type StaticQueue_t or StaticSemaphore_t equals the size of * variable of type StaticQueue_t or StaticSemaphore_t equals the size of
* the real queue and semaphore structures. */ * the real queue and semaphore structures. */
volatile size_t xSize = sizeof( StaticQueue_t ); volatile size_t xSize = sizeof( StaticQueue_t );
configASSERT( xSize == sizeof( Queue_t ) );
/* 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. */ ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */
} }
#endif /* configASSERT_DEFINED */ #endif /* configASSERT_DEFINED */
@ -561,6 +563,8 @@ static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength,
TaskHandle_t pxReturn; TaskHandle_t pxReturn;
Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore;
configASSERT( xSemaphore );
/* This function is called by xSemaphoreGetMutexHolder(), and should not /* This function is called by xSemaphoreGetMutexHolder(), and should not
* be called directly. Note: This is a good way of determining if the * 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 * calling task is the mutex holder, but not a good way of determining the
@ -947,12 +951,12 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue,
* 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 * remove this task from the event list again - but as the
* scheduler is suspended the task will go onto the pending * 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 ); prvUnlockQueue( pxQueue );
/* Resuming the scheduler will move tasks from the pending /* Resuming the scheduler will move tasks from the pending
* ready list into the ready list - so it is feasible that this * 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 * case the yield will not cause a context switch unless there
* is also a higher priority task in the pending ready list. */ * is also a higher priority task in the pending ready list. */
if( xTaskResumeAll() == pdFALSE ) if( xTaskResumeAll() == pdFALSE )
@ -1774,7 +1778,7 @@ BaseType_t xQueuePeek( QueueHandle_t xQueue,
taskEXIT_CRITICAL(); taskEXIT_CRITICAL();
/* Interrupts and other tasks can send to and receive from the queue /* 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(); vTaskSuspendAll();
prvLockQueue( pxQueue ); prvLockQueue( pxQueue );
@ -2723,6 +2727,9 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
{ {
UBaseType_t ux; UBaseType_t ux;
configASSERT( xQueue );
configASSERT( pcQueueName );
/* See if there is an empty space in the registry. A NULL name denotes /* See if there is an empty space in the registry. A NULL name denotes
* a free slot. */ * a free slot. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@ -2753,6 +2760,8 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
UBaseType_t ux; UBaseType_t ux;
const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ 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 /* Note there is nothing here to protect against another task adding or
* removing entries from the registry while it is being searched. */ * removing entries from the registry while it is being searched. */
@ -2781,6 +2790,8 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
{ {
UBaseType_t ux; UBaseType_t ux;
configASSERT( xQueue );
/* See if the handle of the queue being unregistered in actually in the /* See if the handle of the queue being unregistered in actually in the
* registry. */ * registry. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@ -2967,7 +2978,10 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
/* This function must be called form a critical section. */ /* 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 ); configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength );
if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength )