Skip to content

Commit 58aa6f0

Browse files
authored
Fix CBMC issues with latest version of CBMC (#104)
Fixes new CBMC errors due to harnesses having additions that could overflow, potentially adding to a null pointer, as well as assumptions that did not prevent cases where pointer addition could go out of bounds. Also fixes a coverage reduction with new version.
1 parent 529913e commit 58aa6f0

File tree

7 files changed

+26
-20
lines changed

7 files changed

+26
-20
lines changed

test/cbmc/proofs/findHeaderFieldParserCallback/findHeaderFieldParserCallback_harness.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ void findHeaderFieldParserCallback_harness()
4747
pResponse->bufferLen > 0 );
4848

4949
__CPROVER_assume( 0 < fieldLen && fieldLen <= MAX_HEADER_FIELD_LENGTH && fieldLen <= pResponse->bufferLen );
50-
__CPROVER_assume( fieldOffset < fieldLen );
50+
__CPROVER_assume( fieldOffset <= pResponse->bufferLen - fieldLen );
5151
pFieldLoc = pResponse->pBuffer + fieldOffset;
52-
__CPROVER_assume( pFieldLoc + fieldLen < pResponse->pBuffer + pResponse->bufferLen );
5352

5453
__CPROVER_assume( 0 < fieldContextLen && fieldContextLen < CBMC_MAX_OBJECT_SIZE );
5554
pFindHeaderContext->pField = ( char * ) malloc( fieldContextLen );

test/cbmc/proofs/findHeaderValueParserCallback/findHeaderValueParserCallback_harness.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ void findHeaderValueParserCallback_harness()
4646
pResponse->pBuffer != NULL &&
4747
pResponse->bufferLen > 0 );
4848

49-
__CPROVER_assume( 0 < valueLen && valueLen <= pResponse->bufferLen );
50-
__CPROVER_assume( valueOffset < valueLen );
49+
__CPROVER_assume( valueOffset <= pResponse->bufferLen );
50+
__CPROVER_assume( valueLen <= pResponse->bufferLen - valueOffset );
5151
pValueLoc = pResponse->pBuffer + valueOffset;
5252

53-
__CPROVER_assume( 0 < fieldLen && fieldLen <= pResponse->bufferLen );
54-
__CPROVER_assume( fieldOffset < fieldLen );
53+
__CPROVER_assume( fieldOffset <= pResponse->bufferLen );
54+
__CPROVER_assume( fieldLen > 0 );
55+
__CPROVER_assume( fieldLen <= pResponse->bufferLen - fieldOffset );
5556
pFindHeaderContext->pField = pResponse->pBuffer + fieldOffset;
5657
pFindHeaderContext->fieldLen = fieldLen;
5758
pFindHeaderContext->pValueLen = &valueLen;

test/cbmc/proofs/httpParserOnBodyCallback/httpParserOnBodyCallback_harness.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ void httpParserOnBodyCallback_harness()
4545
__CPROVER_assume( length < pResponse->bufferLen );
4646
pLoc = pResponse->pBuffer + length;
4747

48-
__CPROVER_assume( pLoc + length <
49-
( pResponse->pBuffer + pResponse->bufferLen ) );
48+
__CPROVER_assume( pLoc <
49+
( pResponse->pBuffer + pResponse->bufferLen - length ) );
5050

5151
__CPROVER_file_local_core_http_client_c_httpParserOnBodyCallback( pHttpParser, pLoc, length );
5252
}

test/cbmc/proofs/httpParserOnHeaderFieldCallback/httpParserOnHeaderFieldCallback_harness.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ void httpParserOnHeaderFieldCallback_harness()
4747
pResponse = pParsingContext->pResponse;
4848
pResponse->pHeaderParsingCallback = &headerParserCallback;
4949

50-
__CPROVER_assume( length <= pResponse->bufferLen );
51-
__CPROVER_assume( locOffset < length );
50+
__CPROVER_assume( locOffset <= pResponse->bufferLen );
51+
__CPROVER_assume( length <= pResponse->bufferLen - locOffset );
5252
pLoc = pResponse->pBuffer + locOffset;
5353

5454
/* This assumption suppresses an overflow error when incrementing pResponse->headerCount. */

test/cbmc/proofs/httpParserOnHeaderValueCallback/httpParserOnHeaderValueCallback_harness.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ void httpParserOnHeaderValueCallback_harness()
4343
__CPROVER_assume( pParsingContext->pLastHeaderField != NULL );
4444

4545
pResponse = pParsingContext->pResponse;
46-
__CPROVER_assume( length <= pResponse->bufferLen );
47-
__CPROVER_assume( locOffset < length );
46+
__CPROVER_assume( locOffset <= pResponse->bufferLen );
47+
__CPROVER_assume( length <= pResponse->bufferLen - locOffset );
4848
pLoc = pResponse->pBuffer + locOffset;
4949

5050
__CPROVER_file_local_core_http_client_c_httpParserOnHeaderValueCallback( pHttpParser, pLoc, length );

test/cbmc/proofs/httpParserOnStatusCallback/httpParserOnStatusCallback_harness.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ void httpParserOnStatusCallback_harness()
4242
pParsingContext = ( HTTPParsingContext_t * ) pHttpParser->data;
4343

4444
pResponse = pParsingContext->pResponse;
45-
__CPROVER_assume( length <= pResponse->bufferLen );
46-
__CPROVER_assume( locOffset < length );
45+
__CPROVER_assume( locOffset <= pResponse->bufferLen );
46+
__CPROVER_assume( length <= pResponse->bufferLen - locOffset );
4747
pLoc = pResponse->pBuffer + locOffset;
4848

4949
__CPROVER_file_local_core_http_client_c_httpParserOnStatusCallback( pHttpParser, pLoc, length );

test/cbmc/sources/http_cbmc_state.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,13 @@ HTTPResponse_t * allocateHttpResponse( HTTPResponse_t * pResponse )
116116

117117
__CPROVER_assume( headerOffset <= pResponse->bufferLen );
118118

119-
/* It is possible to have no headers in the response so set to NULL or
120-
* an offset in the response buffer. */
121-
pResponse->pHeaders = nondet_bool() ? NULL :
122-
pResponse->pBuffer + headerOffset;
119+
if( pResponse->pBuffer != NULL )
120+
{
121+
/* It is possible to have no headers in the response so set to NULL or
122+
* an offset in the response buffer. */
123+
pResponse->pHeaders = nondet_bool() ? NULL :
124+
pResponse->pBuffer + headerOffset;
125+
}
123126

124127
if( pResponse->pHeaders != NULL )
125128
{
@@ -137,8 +140,11 @@ HTTPResponse_t * allocateHttpResponse( HTTPResponse_t * pResponse )
137140
__CPROVER_assume( bodyOffset <= pResponse->bufferLen );
138141
}
139142

140-
pResponse->pBody = nondet_bool() ? NULL :
141-
pResponse->pBuffer + bodyOffset;
143+
if( pResponse->pBuffer != NULL )
144+
{
145+
pResponse->pBody = nondet_bool() ? NULL :
146+
pResponse->pBuffer + bodyOffset;
147+
}
142148

143149
/* The length of the body MUST be between the start of body and the end
144150
* of the buffer. */

0 commit comments

Comments
 (0)