summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com>2020-08-27 15:37:03 -0700
committerGitHub <noreply@github.com>2020-08-27 15:37:03 -0700
commit0b48e6a3b5bc7db36dc392a449cc5c4dede089f4 (patch)
tree75b7b4f8d82973435508635f71454ef52dcb607f
parent669084ee8f49566d5ea488b1b1d950faae1977c5 (diff)
downloadfreertos-git-0b48e6a3b5bc7db36dc392a449cc5c4dede089f4.tar.gz
Utility macros to improve readability/static analysis. (#219)
* Update FreeRTOS_IP_Private.h * Update FreeRTOS_Sockets.h * Update FreeRTOS_DNS.c * Correct version number * Update version number * Update version number
-rw-r--r--FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c59
-rw-r--r--FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_IP_Private.h37
-rw-r--r--FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_Sockets.h18
3 files changed, 72 insertions, 42 deletions
diff --git a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c
index c63ba537a..ca9a7bd90 100644
--- a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c
+++ b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_DNS.c
@@ -250,6 +250,17 @@ struct xDNSMessage
#include "pack_struct_end.h"
typedef struct xDNSMessage DNSMessage_t;
+ static portINLINE ipDECL_CAST_PTR_FUNC_FOR_TYPE( DNSMessage_t )
+ {
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( DNSMessage_t *)pvArgument;
+ }
+ static portINLINE ipDECL_CAST_CONST_PTR_FUNC_FOR_TYPE( DNSMessage_t )
+ {
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( const DNSMessage_t *) pvArgument;
+ }
+
/* A DNS query consists of a header, as described in 'struct xDNSMessage'
It is followed by 1 or more queries, each one consisting of a name and a tail,
with two fields: type and class
@@ -263,6 +274,12 @@ struct xDNSTail
#include "pack_struct_end.h"
typedef struct xDNSTail DNSTail_t;
+ static portINLINE ipDECL_CAST_PTR_FUNC_FOR_TYPE( DNSTail_t )
+ {
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( DNSTail_t * ) pvArgument;
+ }
+
/* DNS answer record header. */
#include "pack_struct_start.h"
struct xDNSAnswerRecord
@@ -275,6 +292,12 @@ struct xDNSAnswerRecord
#include "pack_struct_end.h"
typedef struct xDNSAnswerRecord DNSAnswerRecord_t;
+ static portINLINE ipDECL_CAST_PTR_FUNC_FOR_TYPE( DNSAnswerRecord_t )
+ {
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( DNSAnswerRecord_t * ) pvArgument;
+ }
+
#if( ipconfigUSE_LLMNR == 1 )
#include "pack_struct_start.h"
@@ -377,7 +400,7 @@ typedef struct xDNSAnswerRecord DNSAnswerRecord_t;
void vDNSCheckCallBack( void *pvSearchID )
{
const ListItem_t * pxIterator;
- const ListItem_t * xEnd = ipPOINTER_CAST( const ListItem_t *, listGET_END_MARKER( &xCallbackList ) );
+ const ListItem_t * xEnd = listGET_END_MARKER( &xCallbackList );
vTaskSuspendAll();
{
@@ -467,7 +490,7 @@ typedef struct xDNSAnswerRecord DNSAnswerRecord_t;
{
BaseType_t xResult = pdFALSE;
const ListItem_t * pxIterator;
- const ListItem_t * xEnd = ipPOINTER_CAST( const ListItem_t *, listGET_END_MARKER( &xCallbackList ) );
+ const ListItem_t * xEnd = listGET_END_MARKER( &xCallbackList );
vTaskSuspendAll();
{
@@ -549,8 +572,8 @@ TickType_t uxIdentifier = 0U;
else
{
FreeRTOS_printf( ( "prvPrepareLookup: name is too long ( %lu > %lu )\n",
- ( unsigned long ) xLength,
- ( unsigned long ) ipconfigDNS_CACHE_NAME_LENGTH ) );
+ ( uint32_t ) xLength,
+ ( uint32_t ) ipconfigDNS_CACHE_NAME_LENGTH ) );
}
}
}
@@ -709,7 +732,7 @@ TickType_t uxWriteTimeOut_ticks = ipconfigDNS_SEND_BLOCK_TIME_TICKS;
if( bHasDot == pdFALSE )
{
/* Use LLMNR addressing. */
- ( ipPOINTER_CAST( DNSMessage_t *, pucUDPPayloadBuffer ) )->usFlags = 0;
+ ( ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pucUDPPayloadBuffer ) )->usFlags = 0;
xAddress.sin_addr = ipLLMNR_IP_ADDR; /* Is in network byte order. */
xAddress.sin_port = ipLLMNR_PORT;
xAddress.sin_port = FreeRTOS_ntohs( xAddress.sin_port );
@@ -732,7 +755,7 @@ TickType_t uxWriteTimeOut_ticks = ipconfigDNS_SEND_BLOCK_TIME_TICKS;
if( lBytes > 0 )
{
BaseType_t xExpected;
- const DNSMessage_t *pxDNSMessageHeader = ipPOINTER_CAST( DNSMessage_t *, pucReceiveBuffer );
+ const DNSMessage_t *pxDNSMessageHeader = ipCAST_CONST_PTR_TO_CONST_TYPE_PTR( DNSMessage_t, pucReceiveBuffer );
/* See if the identifiers match. */
if( uxIdentifier == ( TickType_t ) pxDNSMessageHeader->usIdentifier )
@@ -815,7 +838,7 @@ static const DNSMessage_t xDefaultPartDNSHeader =
/* Write in a unique identifier. Cast the Payload Buffer to DNSMessage_t
* to easily access fields of the DNS Message. */
- pxDNSMessageHeader = ipPOINTER_CAST( DNSMessage_t *, pucUDPPayloadBuffer );
+ pxDNSMessageHeader = ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pucUDPPayloadBuffer );
pxDNSMessageHeader->usIdentifier = ( uint16_t ) uxIdentifier;
/* Create the resource record at the end of the header. First
@@ -856,7 +879,7 @@ static const DNSMessage_t xDefaultPartDNSHeader =
/* Finish off the record. Cast the record onto DNSTail_t stucture to easily
* access the fields of the DNS Message. */
- pxTail = ipPOINTER_CAST(DNSTail_t *, &( pucByte[ 1 ] ) );
+ pxTail = ipCAST_PTR_TO_TYPE_PTR( DNSTail_t, &( pucByte[ 1 ] ) );
#if defined( _lint ) || defined( __COVERITY__ )
( void ) pxTail;
@@ -1051,7 +1074,7 @@ size_t uxPayloadSize;
if( uxPayloadSize >= sizeof( DNSMessage_t ) )
{
pxDNSMessageHeader =
- ipPOINTER_CAST( DNSMessage_t *, &( pxNetworkBuffer->pucEthernetBuffer [ sizeof( UDPPacket_t ) ] ) );
+ ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pxNetworkBuffer->pucEthernetBuffer );
/* The parameter pdFALSE indicates that the reply was not expected. */
( void ) prvParseDNSReply( ( uint8_t * ) pxDNSMessageHeader,
@@ -1069,7 +1092,7 @@ size_t uxPayloadSize;
uint32_t ulNBNSHandlePacket( NetworkBufferDescriptor_t * pxNetworkBuffer )
{
- UDPPacket_t *pxUDPPacket = ipPOINTER_CAST( UDPPacket_t *, pxNetworkBuffer->pucEthernetBuffer );
+ UDPPacket_t *pxUDPPacket = ipCAST_PTR_TO_TYPE_PTR( UDPPacket_t, pxNetworkBuffer->pucEthernetBuffer );
uint8_t *pucUDPPayloadBuffer = &( pxNetworkBuffer->pucEthernetBuffer[ sizeof( *pxUDPPacket ) ] );
prvTreatNBNS( pucUDPPayloadBuffer,
@@ -1119,7 +1142,7 @@ BaseType_t xReturn = pdTRUE;
/* Parse the DNS message header. Map the byte stream onto a structure
* for easier access. */
- pxDNSMessageHeader = ipPOINTER_CAST( DNSMessage_t *, pucUDPPayloadBuffer );
+ pxDNSMessageHeader = ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pucUDPPayloadBuffer );
/* Introduce a do {} while (0) to allow the use of breaks. */
do
@@ -1266,7 +1289,7 @@ BaseType_t xReturn = pdTRUE;
/* This is the required record type and is of sufficient size. */
/* Mapping pucByte to a DNSAnswerRecord allows easy access of the
* fields of the structure. */
- pxDNSAnswerRecord = ipPOINTER_CAST( DNSAnswerRecord_t *, pucByte );
+ pxDNSAnswerRecord = ipCAST_PTR_TO_TYPE_PTR( DNSAnswerRecord_t, pucByte );
/* Sanity check the data length of an IPv4 answer. */
if( FreeRTOS_ntohs( pxDNSAnswerRecord->usDataLength ) == ( uint16_t ) sizeof( uint32_t ) )
@@ -1319,7 +1342,7 @@ BaseType_t xReturn = pdTRUE;
/* It's not an A record, so skip it. Get the header location
and then jump over the header. */
/* Cast the response to DNSAnswerRecord for easy access to fields of the DNS response. */
- pxDNSAnswerRecord = ipPOINTER_CAST( DNSAnswerRecord_t *, pucByte );
+ pxDNSAnswerRecord = ipCAST_PTR_TO_TYPE_PTR( DNSAnswerRecord_t, pucByte );
pucByte = &( pucByte[ sizeof( DNSAnswerRecord_t ) ] );
uxSourceBytesRemaining -= sizeof( DNSAnswerRecord_t );
@@ -1380,7 +1403,7 @@ BaseType_t xReturn = pdTRUE;
pucByte = &( pucNewBuffer[ xOffset1 ] );
pcRequestedName = ( char * ) &( pucNewBuffer[ xOffset2 ] );
- pxDNSMessageHeader = ipPOINTER_CAST( DNSMessage_t *, pucNewBuffer );
+ pxDNSMessageHeader = ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pucNewBuffer );
}
else
{
@@ -1568,7 +1591,7 @@ BaseType_t xReturn = pdTRUE;
/* Should not occur: pucUDPPayloadBuffer is part of a xNetworkBufferDescriptor */
if( pxNetworkBuffer != NULL )
{
- pxMessage = ipPOINTER_CAST( DNSMessage_t *, pucUDPPayloadBuffer );
+ pxMessage = ipCAST_PTR_TO_TYPE_PTR( DNSMessage_t, pucUDPPayloadBuffer );
/* As the fields in the structures are not word-aligned, we have to
copy the values byte-by-byte using macro's vSetField16() and vSetField32() */
@@ -1615,7 +1638,7 @@ BaseType_t xReturn;
/* This must be the first time this function has been called. Create
the socket. */
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
- if( ( xSocket == FREERTOS_INVALID_SOCKET ) || ( xSocket == NULL ) )
+ if( prvSocketValid( xSocket ) != pdTRUE )
{
/* There was an error, return NULL. */
xSocket = NULL;
@@ -1652,7 +1675,7 @@ BaseType_t xReturn;
UDPHeader_t *pxUDPHeader;
size_t uxDataLength;
- pxUDPPacket = ipPOINTER_CAST( UDPPacket_t *, pxNetworkBuffer->pucEthernetBuffer );
+ pxUDPPacket = ipCAST_PTR_TO_TYPE_PTR( UDPPacket_t, pxNetworkBuffer->pucEthernetBuffer );
pxIPHeader = &pxUDPPacket->xIPHeader;
pxUDPHeader = &pxUDPPacket->xUDPHeader;
/* HT: started using defines like 'ipSIZE_OF_xxx' */
@@ -1700,7 +1723,7 @@ BaseType_t xReturn;
{
BaseType_t x;
BaseType_t xFound = pdFALSE;
- uint32_t ulCurrentTimeSeconds = ( xTaskGetTickCount() / portTICK_PERIOD_MS ) / 1000U;
+ uint32_t ulCurrentTimeSeconds = ( xTaskGetTickCount() / portTICK_PERIOD_MS ) / 1000UL;
uint32_t ulIPAddressIndex = 0;
static BaseType_t xFreeEntry = 0;
diff --git a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_IP_Private.h b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_IP_Private.h
index e59ee63da..e9478d946 100644
--- a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_IP_Private.h
+++ b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_IP_Private.h
@@ -45,6 +45,20 @@ extern "C" {
#include "event_groups.h"
+/*-----------------------------------------------------------*/
+/* Utility macros for marking casts as recognized during */
+/* static analysis. */
+/*-----------------------------------------------------------*/
+#define ipCAST_PTR_TO_TYPE_PTR( TYPE, pointer ) ( vCastPointerTo_##TYPE( ( void * )( pointer ) ) )
+#define ipCAST_CONST_PTR_TO_CONST_TYPE_PTR( TYPE, pointer ) ( vCastConstPointerTo_##TYPE( ( const void * )( pointer ) ) )
+
+/*-----------------------------------------------------------*/
+/* Utility macros for declaring cast utility functions in */
+/* order to centralize typecasting for static analysis. */
+/*-----------------------------------------------------------*/
+#define ipDECL_CAST_PTR_FUNC_FOR_TYPE( TYPE ) TYPE * vCastPointerTo_##TYPE( void * pvArgument )
+#define ipDECL_CAST_CONST_PTR_FUNC_FOR_TYPE( TYPE ) const TYPE * vCastConstPointerTo_##TYPE( const void * pvArgument )
+
typedef struct xNetworkAddressingParameters
{
uint32_t ulDefaultIPAddress;
@@ -189,6 +203,17 @@ struct xUDP_PACKET
#include "pack_struct_end.h"
typedef struct xUDP_PACKET UDPPacket_t;
+static portINLINE ipDECL_CAST_PTR_FUNC_FOR_TYPE( UDPPacket_t )
+{
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( UDPPacket_t *)pvArgument;
+}
+static portINLINE ipDECL_CAST_CONST_PTR_FUNC_FOR_TYPE( UDPPacket_t )
+{
+ /* coverity[misra_c_2012_rule_11_3_violation] */
+ return ( const UDPPacket_t *) pvArgument;
+}
+
#include "pack_struct_start.h"
struct xTCP_PACKET
{
@@ -828,15 +853,3 @@ void vIPNetworkUpCalls( void );
#endif /* FREERTOS_IP_PRIVATE_H */
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_Sockets.h b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_Sockets.h
index a6329ebc3..0ff55d17a 100644
--- a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_Sockets.h
+++ b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/include/FreeRTOS_Sockets.h
@@ -205,6 +205,12 @@ struct xSOCKET;
typedef struct xSOCKET *Socket_t;
typedef struct xSOCKET const * ConstSocket_t;
+static portINLINE int prvSocketValid( Socket_t xSocket )
+{
+ /* coverity[misra_c_2012_rule_11_4_violation] */
+ return ( ( xSocket != FREERTOS_INVALID_SOCKET ) && ( xSocket != NULL ) );
+}
+
#if( ipconfigSUPPORT_SELECT_FUNCTION == 1 )
/* The SocketSet_t type is the equivalent to the fd_set type used by the
Berkeley API. */
@@ -417,15 +423,3 @@ void FreeRTOS_netstat( void );
#endif /* FREERTOS_SOCKETS_H */
-
-
-
-
-
-
-
-
-
-
-
-