[修改] 增加freeRTOS
1. 版本FreeRTOSv202212.01,命名为kernel;
This commit is contained in:
@ -0,0 +1,24 @@
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
|
||||
/* Function prvParseDNSReply is proven to be correct separately.
|
||||
* The proof can be found here: https://github.com/aws/amazon-freertos/tree/master/tools/cbmc/proofs/ParseDNSReply */
|
||||
uint32_t prvParseDNSReply( uint8_t * pucUDPPayloadBuffer,
|
||||
size_t xBufferLength,
|
||||
BaseType_t xExpected )
|
||||
{
|
||||
}
|
||||
|
||||
void harness()
|
||||
{
|
||||
NetworkBufferDescriptor_t xNetworkBuffer;
|
||||
|
||||
xNetworkBuffer.pucEthernetBuffer = malloc( sizeof( UDPPacket_t ) + sizeof( DNSMessage_t ) );
|
||||
ulDNSHandlePacket( &xNetworkBuffer );
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
{
|
||||
"ENTRY": "DNShandlePacket",
|
||||
"CBMCFLAGS": "--unwind 1",
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto"
|
||||
],
|
||||
"DEF":
|
||||
[
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
|
||||
|
||||
void harness()
|
||||
{
|
||||
if( ipconfigUSE_DNS_CACHE != 0 )
|
||||
{
|
||||
FreeRTOS_dnsclear();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
{
|
||||
"ENTRY": "DNSclear",
|
||||
################################################################
|
||||
# This configuration flag uses DNS cache
|
||||
"USE_CACHE":1,
|
||||
"CBMCFLAGS":
|
||||
[
|
||||
"--unwind 1",
|
||||
"--nondet-static"
|
||||
],
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto"
|
||||
],
|
||||
"DEF":
|
||||
[
|
||||
"ipconfigUSE_DNS_CACHE={USE_CACHE}"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,171 @@
|
||||
/* Standard includes. */
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_Sockets.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
#include "FreeRTOS_UDP_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_DHCP.h"
|
||||
#include "NetworkBufferManagement.h"
|
||||
#include "NetworkInterface.h"
|
||||
|
||||
#include "cbmc.h"
|
||||
|
||||
uint32_t FreeRTOS_dnslookup( const char * pcHostName );
|
||||
Socket_t DNS_CreateSocket( TickType_t uxReadTimeout_ticks );
|
||||
void DNS_CloseSocket( Socket_t xDNSSocket );
|
||||
void DNS_ReadReply( Socket_t xDNSSocket,
|
||||
struct freertos_sockaddr * xAddress,
|
||||
struct xDNSBuffer * pxDNSBuf );
|
||||
uint32_t DNS_SendRequest( Socket_t xDNSSocket,
|
||||
struct freertos_sockaddr * xAddress,
|
||||
struct xDNSBuffer * pxDNSBuf );
|
||||
uint32_t DNS_ParseDNSReply( uint8_t * pucUDPPayloadBuffer,
|
||||
size_t xBufferLength,
|
||||
BaseType_t xExpected );
|
||||
|
||||
/****************************************************************
|
||||
* We abstract:
|
||||
*
|
||||
* All kernel task scheduling functions since we are doing
|
||||
* sequential verification and the sequential verification of these
|
||||
* sequential primitives is done elsewhere.
|
||||
*
|
||||
* Many methods in the FreeRTOS TCP API in stubs/freertos_api.c
|
||||
*
|
||||
* DNS_ParseDNSReply proved memory safe elsewhere
|
||||
*
|
||||
* prvCreateDNSMessage
|
||||
*
|
||||
* This proof assumes the length of pcHostName is bounded by
|
||||
* MAX_HOSTNAME_LEN. We have to bound this length because we have to
|
||||
* bound the iterations of strcmp.
|
||||
****************************************************************/
|
||||
|
||||
/****************************************************************
|
||||
* Abstract DNS_ParseDNSReply proved memory safe in ParseDNSReply.
|
||||
*
|
||||
* We stub out his function to fill the payload buffer with
|
||||
* unconstrained data and return an unconstrained size.
|
||||
*
|
||||
* The function under test uses only the return value of this
|
||||
* function.
|
||||
****************************************************************/
|
||||
|
||||
uint32_t DNS_ParseDNSReply( uint8_t * pucUDPPayloadBuffer,
|
||||
size_t xBufferLength,
|
||||
BaseType_t xExpected )
|
||||
{
|
||||
uint32_t size;
|
||||
|
||||
__CPROVER_havoc_object( pucUDPPayloadBuffer );
|
||||
return size;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* Abstract DNS_SendRequest
|
||||
*
|
||||
* We stub out this function with return constraint of true or false
|
||||
*
|
||||
****************************************************************/
|
||||
uint32_t DNS_SendRequest( Socket_t xDNSSocket,
|
||||
struct freertos_sockaddr * xAddress,
|
||||
struct xDNSBuffer * pxDNSBuf )
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
__CPROVER_assume( ret >= 0 );
|
||||
__CPROVER_assume( ret <= 1 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* Abstract DNS_ReadReply
|
||||
*
|
||||
* We stub out this function which returned a dns_buffer filled with random data
|
||||
*
|
||||
****************************************************************/
|
||||
void DNS_ReadReply( Socket_t xDNSSocket,
|
||||
struct freertos_sockaddr * xAddress,
|
||||
struct xDNSBuffer * pxDNSBuf )
|
||||
{
|
||||
int len;
|
||||
|
||||
pxDNSBuf->pucPayloadBuffer = safeMalloc( len );
|
||||
|
||||
pxDNSBuf->uxPayloadLength = len;
|
||||
|
||||
__CPROVER_assume( len < CBMC_MAX_OBJECT_SIZE );
|
||||
__CPROVER_assume( pxDNSBuf->pucPayloadBuffer != NULL );
|
||||
|
||||
__CPROVER_havoc_slice( pxDNSBuf->pucPayloadBuffer, pxDNSBuf->uxPayloadSize );
|
||||
}
|
||||
|
||||
|
||||
void DNS_CloseSocket( Socket_t xDNSSocket )
|
||||
{
|
||||
}
|
||||
|
||||
Socket_t DNS_CreateSocket( TickType_t uxReadTimeout_ticks )
|
||||
{
|
||||
Socket_t sock;
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
uint32_t FreeRTOS_dnslookup( const char * pcHostName )
|
||||
{
|
||||
int ret;
|
||||
|
||||
__CPROVER_assume( ret < 0xFFFF );
|
||||
__CPROVER_assume( ret > 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Abstract prvCreateDNSMessage
|
||||
*
|
||||
* This function writes a header, a hostname, and a constant amount of
|
||||
* data into the payload buffer, and returns the amount of data
|
||||
* written. This abstraction just fills the entire buffer with
|
||||
* unconstrained data and returns and unconstrained length.
|
||||
****************************************************************/
|
||||
|
||||
size_t prvCreateDNSMessage( uint8_t * pucUDPPayloadBuffer,
|
||||
const char * pcHostName,
|
||||
TickType_t uxIdentifier )
|
||||
{
|
||||
__CPROVER_havoc_object( pucUDPPayloadBuffer );
|
||||
size_t size;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* The proof for FreeRTOS_gethostbyname.
|
||||
****************************************************************/
|
||||
|
||||
void harness()
|
||||
{
|
||||
size_t len;
|
||||
|
||||
__CPROVER_assume( len <= MAX_HOSTNAME_LEN );
|
||||
char * pcHostName = safeMalloc( len );
|
||||
|
||||
__CPROVER_assume( len > 0 ); /* prvProcessDNSCache strcmp */
|
||||
__CPROVER_assume( pcHostName != NULL );
|
||||
pcHostName[ len - 1 ] = NULL;
|
||||
|
||||
FreeRTOS_gethostbyname( pcHostName );
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
{
|
||||
"ENTRY": "DNSgetHostByName",
|
||||
|
||||
################################################################
|
||||
# This configuration sets callback to 0.
|
||||
# It also sets MAX_HOSTNAME_LEN to 10 to bound strcmp.
|
||||
# According to the specification MAX_HOST_NAME is upto 255.
|
||||
|
||||
"callback": 0,
|
||||
"MAX_HOSTNAME_LEN": 10,
|
||||
"HOSTNAME_UNWIND": "__eval {MAX_HOSTNAME_LEN} + 1",
|
||||
|
||||
"CBMCFLAGS":
|
||||
[
|
||||
"--unwind 1",
|
||||
"--unwindset prvCreateDNSMessage.0:{HOSTNAME_UNWIND},prvCreateDNSMessage.1:{HOSTNAME_UNWIND},strlen.0:{HOSTNAME_UNWIND},__builtin___strcpy_chk.0:{HOSTNAME_UNWIND},strcmp.0:{HOSTNAME_UNWIND},strcpy.0:{HOSTNAME_UNWIND}",
|
||||
"--unwindset prvGetHostByNameOp_WithRetry.0:{HOSTNAME_UNWIND}",
|
||||
"--nondet-static"
|
||||
],
|
||||
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/cbmc/stubs/cbmc.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/cbmc/stubs/freertos_api.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS_Parser.goto"
|
||||
],
|
||||
|
||||
"DEF":
|
||||
[
|
||||
"ipconfigDNS_USE_CALLBACKS={callback}",
|
||||
"MAX_HOSTNAME_LEN={MAX_HOSTNAME_LEN}"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
{ "expected-missing-functions":
|
||||
[
|
||||
"vLoggingPrintf",
|
||||
"xApplicationGetRandomNumber",
|
||||
"xTaskGetTickCount"
|
||||
],
|
||||
"proof-name": "DNSgetHostByName",
|
||||
"proof-root": "tools/cbmc/proofs"
|
||||
}
|
||||
@ -0,0 +1,113 @@
|
||||
/* Standard includes. */
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_Sockets.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
#include "FreeRTOS_UDP_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_DHCP.h"
|
||||
#include "NetworkBufferManagement.h"
|
||||
#include "NetworkInterface.h"
|
||||
|
||||
#include "cbmc.h"
|
||||
|
||||
/****************************************************************
|
||||
* We abstract:
|
||||
*
|
||||
* All kernel task scheduling functions since we are doing
|
||||
* sequential verification and the sequential verification of these
|
||||
* sequential primitives is done elsewhere.
|
||||
*
|
||||
* Many methods in the FreeRTOS TCP API in stubs/freertos_api.c
|
||||
*
|
||||
* DNS_ParseDNSReply proved memory safe elsewhere
|
||||
*
|
||||
* prvCreateDNSMessage
|
||||
*
|
||||
* This proof assumes the length of pcHostName is bounded by
|
||||
* MAX_HOSTNAME_LEN. We have to bound this length because we have to
|
||||
* bound the iterations of strcmp.
|
||||
****************************************************************/
|
||||
|
||||
/****************************************************************
|
||||
* Abstract DNS_ParseDNSReply proved memory safe in ParseDNSReply.
|
||||
*
|
||||
* We stub out his function to fill the payload buffer with
|
||||
* unconstrained data and return an unconstrained size.
|
||||
*
|
||||
* The function under test uses only the return value of this
|
||||
* function.
|
||||
****************************************************************/
|
||||
|
||||
uint32_t DNS_ParseDNSReply( uint8_t * pucUDPPayloadBuffer,
|
||||
size_t xBufferLength,
|
||||
BaseType_t xExpected )
|
||||
{
|
||||
__CPROVER_assert( pucUDPPayloadBuffer != NULL,
|
||||
"Precondition: pucUDPPayloadBuffer != NULL" );
|
||||
|
||||
__CPROVER_havoc_object( pucUDPPayloadBuffer );
|
||||
return nondet_uint32();
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* Abstract prvCreateDNSMessage
|
||||
*
|
||||
* This function writes a header, a hostname, and a constant amount of
|
||||
* data into the payload buffer, and returns the amount of data
|
||||
* written. This abstraction just fills the entire buffer with
|
||||
* unconstrained data and returns and unconstrained length.
|
||||
****************************************************************/
|
||||
|
||||
size_t prvCreateDNSMessage( uint8_t * pucUDPPayloadBuffer,
|
||||
const char * pcHostName,
|
||||
TickType_t uxIdentifier )
|
||||
{
|
||||
__CPROVER_assert( pucUDPPayloadBuffer != NULL,
|
||||
"Precondition: pucUDPPayloadBuffer != NULL" );
|
||||
__CPROVER_assert( pcHostName != NULL,
|
||||
"Precondition: pcHostName != NULL" );
|
||||
|
||||
__CPROVER_havoc_object( pucUDPPayloadBuffer );
|
||||
return nondet_sizet();
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* A stub for a function callback.
|
||||
****************************************************************/
|
||||
|
||||
void func( const char * pcHostName,
|
||||
void * pvSearchID,
|
||||
uint32_t ulIPAddress )
|
||||
{
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* The proof for FreeRTOS_gethostbyname_a.
|
||||
****************************************************************/
|
||||
|
||||
void harness()
|
||||
{
|
||||
size_t len;
|
||||
|
||||
__CPROVER_assume( len <= MAX_HOSTNAME_LEN );
|
||||
char * pcHostName = safeMalloc( len );
|
||||
|
||||
__CPROVER_assume( len > 0 ); /* prvProcessDNSCache strcmp */
|
||||
__CPROVER_assume( pcHostName != NULL );
|
||||
pcHostName[ len - 1 ] = NULL;
|
||||
|
||||
FOnDNSEvent pCallback = func;
|
||||
TickType_t xTimeout;
|
||||
void * pvSearchID;
|
||||
|
||||
FreeRTOS_gethostbyname_a( pcHostName, pCallback, pvSearchID, xTimeout );
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
{
|
||||
"ENTRY": "DNSgetHostByName_a",
|
||||
################################################################
|
||||
# This configuration flag sets callback to 1. It also sets MAX_HOSTNAME_LEN to 10 and MAX_REQ_SIZE to 50 for performance issues.
|
||||
# According to the specification MAX_HOST_NAME is upto 255.
|
||||
"callback": 1,
|
||||
"MAX_HOSTNAME_LEN": 10,
|
||||
"HOSTNAME_UNWIND": "__eval {MAX_HOSTNAME_LEN} + 1",
|
||||
"CBMCFLAGS":
|
||||
[
|
||||
"--unwind 1",
|
||||
"--unwindset prvCreateDNSMessage.0:{HOSTNAME_UNWIND},prvCreateDNSMessage.1:{HOSTNAME_UNWIND},prvGetHostByName.0:{HOSTNAME_UNWIND},prvProcessDNSCache.0:5,strlen.0:{HOSTNAME_UNWIND},__builtin___strcpy_chk.0:{HOSTNAME_UNWIND},strcmp.0:{HOSTNAME_UNWIND},xTaskResumeAll.0:{HOSTNAME_UNWIND},xTaskResumeAll.1:{HOSTNAME_UNWIND},strcpy.0:{HOSTNAME_UNWIND}",
|
||||
"--nondet-static"
|
||||
],
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/cbmc/stubs/cbmc.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/cbmc/stubs/freertos_api.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS_Parser.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_IP.goto"
|
||||
],
|
||||
"DEF":
|
||||
[
|
||||
"ipconfigDNS_USE_CALLBACKS={callback}",
|
||||
"MAX_HOSTNAME_LEN={MAX_HOSTNAME_LEN}",
|
||||
# This value is defined only when ipconfigUSE_DNS_CACHE==1
|
||||
"ipconfigDNS_CACHE_NAME_LENGTH=254"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
{ "expected-missing-functions":
|
||||
[
|
||||
"vLoggingPrintf",
|
||||
"xApplicationGetRandomNumber",
|
||||
"vListInsertEnd",
|
||||
"vTaskSetTimeOutState",
|
||||
"vTaskSuspendAll",
|
||||
"xTaskGetTickCount",
|
||||
"xTaskResumeAll"
|
||||
],
|
||||
"proof-name": "DNSgetHostByName_a",
|
||||
"proof-root": "tools/cbmc/proofs"
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "list.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
|
||||
|
||||
/* This proof assumes the length of pcHostName is bounded by MAX_HOSTNAME_LEN. This also abstracts the concurrency. */
|
||||
|
||||
void vDNSInitialise( void );
|
||||
|
||||
void vDNSSetCallBack( const char * pcHostName,
|
||||
void * pvSearchID,
|
||||
FOnDNSEvent pCallbackFunction,
|
||||
TickType_t xTimeout,
|
||||
TickType_t xIdentifier );
|
||||
|
||||
void * safeMalloc( size_t xWantedSize ) /* Returns a NULL pointer if the wanted size is 0. */
|
||||
{
|
||||
if( xWantedSize == 0 )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint8_t byte;
|
||||
|
||||
return byte ? malloc( xWantedSize ) : NULL;
|
||||
}
|
||||
|
||||
/* Abstraction of xTaskCheckForTimeOut from task pool. This also abstracts the concurrency. */
|
||||
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,
|
||||
TickType_t * const pxTicksToWait )
|
||||
{
|
||||
}
|
||||
|
||||
/* Abstraction of xTaskResumeAll from task pool. This also abstracts the concurrency. */
|
||||
BaseType_t xTaskResumeAll( void )
|
||||
{
|
||||
}
|
||||
|
||||
/* The function func mimics the callback function.*/
|
||||
void func( const char * pcHostName,
|
||||
void * pvSearchID,
|
||||
uint32_t ulIPAddress )
|
||||
{
|
||||
}
|
||||
|
||||
void harness()
|
||||
{
|
||||
vDNSInitialise(); /* We initialize the callbacklist in order to be able to check for functions that timed out. */
|
||||
size_t pvSearchID;
|
||||
FOnDNSEvent pCallback = func;
|
||||
TickType_t xTimeout;
|
||||
TickType_t xIdentifier;
|
||||
size_t len;
|
||||
|
||||
__CPROVER_assume( len >= 0 && len <= MAX_HOSTNAME_LEN );
|
||||
char * pcHostName = safeMalloc( len );
|
||||
|
||||
if( len && pcHostName )
|
||||
{
|
||||
pcHostName[ len - 1 ] = NULL;
|
||||
}
|
||||
|
||||
vDNSSetCallBack( pcHostName, &pvSearchID, pCallback, xTimeout, xIdentifier ); /* Add an item to be able to check the cancel function if the list is non-empty. */
|
||||
FreeRTOS_gethostbyname_cancel( &pvSearchID );
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
{
|
||||
"ENTRY": "DNSgetHostByName_cancel",
|
||||
################################################################
|
||||
# This configuration flag sets callback to 1. It also sets MAX_HOSTNAME_LEN to 10 for performance issues.
|
||||
# According to the specification MAX_HOST_NAME is upto 255.
|
||||
"callback": 1,
|
||||
"MAX_HOSTNAME_LEN": 10,
|
||||
"HOSTNAME_UNWIND": "__eval {MAX_HOSTNAME_LEN} + 1",
|
||||
"CBMCFLAGS":
|
||||
[
|
||||
"--unwind 1",
|
||||
"--unwindset prvProcessDNSCache.0:5,strlen.0:{HOSTNAME_UNWIND},__builtin___strcpy_chk.0:{HOSTNAME_UNWIND},vDNSCheckCallBack.0:2,strcpy.0:{HOSTNAME_UNWIND}",
|
||||
"--nondet-static"
|
||||
],
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/FreeRTOS-Kernel/tasks.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/FreeRTOS-Kernel/list.goto"
|
||||
],
|
||||
"DEF":
|
||||
[
|
||||
"ipconfigDNS_USE_CALLBACKS={callback}",
|
||||
"MAX_HOSTNAME_LEN={MAX_HOSTNAME_LEN}",
|
||||
# This value is defined only when ipconfigUSE_DNS_CACHE==1
|
||||
"ipconfigDNS_CACHE_NAME_LENGTH=254"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "list.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
|
||||
/* This assumes that the length of the hostname is bounded by MAX_HOSTNAME_LEN. */
|
||||
void * safeMalloc( size_t xWantedSize )
|
||||
{
|
||||
if( xWantedSize == 0 )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint8_t byte;
|
||||
|
||||
return byte ? malloc( xWantedSize ) : NULL;
|
||||
}
|
||||
|
||||
void harness()
|
||||
{
|
||||
if( ipconfigUSE_DNS_CACHE != 0 )
|
||||
{
|
||||
size_t len;
|
||||
__CPROVER_assume( len >= 0 && len <= MAX_HOSTNAME_LEN );
|
||||
char * pcHostName = safeMalloc( len ); /* malloc is replaced by safeMalloc */
|
||||
|
||||
if( len && pcHostName )
|
||||
{
|
||||
pcHostName[ len - 1 ] = NULL;
|
||||
}
|
||||
|
||||
if( pcHostName ) /* guarding against NULL pointer */
|
||||
{
|
||||
FreeRTOS_dnslookup( pcHostName );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
{
|
||||
"ENTRY": "DNSlookup",
|
||||
################################################################
|
||||
# This configuration uses DNS cache and the MAX_HOSTNAME_LEN is set to 255 according to the specification
|
||||
"MAX_HOSTNAME_LEN": 255,
|
||||
"HOSTNAME_UNWIND": "__eval {MAX_HOSTNAME_LEN} + 1",
|
||||
"USE_CACHE": 1,
|
||||
"CBMCFLAGS":
|
||||
[
|
||||
"--unwind 1",
|
||||
"--unwindset prvProcessDNSCache.0:5,strcmp.0:{HOSTNAME_UNWIND}",
|
||||
"--nondet-static"
|
||||
],
|
||||
"OBJS":
|
||||
[
|
||||
"$(ENTRY)_harness.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_DNS.goto",
|
||||
"$(FREERTOS_PLUS_TCP)/test/FreeRTOS-Kernel/tasks.goto"
|
||||
],
|
||||
"DEF":
|
||||
[
|
||||
"ipconfigUSE_DNS_CACHE={USE_CACHE}",
|
||||
"MAX_HOSTNAME_LEN={MAX_HOSTNAME_LEN}"
|
||||
],
|
||||
"OPT" : "-m32"
|
||||
}
|
||||
Reference in New Issue
Block a user