Skip to content

Commit 6cc507e

Browse files
feliperodriAalok Thakkar
authored and
Aalok Thakkar
committed
Adds a code contract module to goto-instrument
Signed-off-by: Felipe R. Monteiro <[email protected]>
1 parent 5592d7e commit 6cc507e

File tree

6 files changed

+47
-0
lines changed

6 files changed

+47
-0
lines changed

src/ansi-c/c_typecheck_base.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class c_typecheck_baset:
144144
virtual void typecheck_while(code_whilet &code);
145145
virtual void typecheck_dowhile(code_dowhilet &code);
146146
virtual void typecheck_start_thread(codet &code);
147+
virtual void typecheck_spec_assigns(codet &code);
147148
virtual void typecheck_spec_loop_invariant(codet &code);
148149
virtual void typecheck_spec_decreases(codet &code);
149150

src/ansi-c/c_typecheck_code.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ void c_typecheck_baset::typecheck_for(codet &code)
484484
typecheck_code(code); // recursive call
485485
}
486486

487+
typecheck_spec_assigns(code);
487488
typecheck_spec_loop_invariant(code);
488489
typecheck_spec_decreases(code);
489490
}
@@ -773,6 +774,7 @@ void c_typecheck_baset::typecheck_while(code_whilet &code)
773774
break_is_allowed=old_break_is_allowed;
774775
continue_is_allowed=old_continue_is_allowed;
775776

777+
typecheck_spec_assigns(code);
776778
typecheck_spec_loop_invariant(code);
777779
typecheck_spec_decreases(code);
778780
}
@@ -807,10 +809,29 @@ void c_typecheck_baset::typecheck_dowhile(code_dowhilet &code)
807809
break_is_allowed=old_break_is_allowed;
808810
continue_is_allowed=old_continue_is_allowed;
809811

812+
typecheck_spec_assigns(code);
810813
typecheck_spec_loop_invariant(code);
811814
typecheck_spec_decreases(code);
812815
}
813816

817+
void c_typecheck_baset::typecheck_spec_assigns(codet &code)
818+
{
819+
if(code.find(ID_C_spec_assigns).is_not_nil())
820+
{
821+
for(const exprt &operand : static_cast<exprt &>(code.add(ID_C_spec_assigns)).operands())
822+
{
823+
if(
824+
operand.id() != ID_symbol && operand.id() != ID_ptrmember &&
825+
operand.id() != ID_member && operand.id() != ID_dereference)
826+
{
827+
error().source_location = code.source_location();
828+
error() << "illegal target in assigns clause" << eom;
829+
throw 0;
830+
}
831+
}
832+
}
833+
}
834+
814835
void c_typecheck_baset::typecheck_spec_loop_invariant(codet &code)
815836
{
816837
if(code.find(ID_C_spec_loop_invariant).is_not_nil())

src/ansi-c/parser.y

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,9 @@ iteration_statement:
24532453
statement($$, ID_while);
24542454
parser_stack($$).add_to_operands(std::move(parser_stack($3)), std::move(parser_stack($8)));
24552455

2456+
if(!parser_stack($4).is_not_nil())
2457+
parser_stack($$).add(ID_C_spec_assigns).swap(parser_stack($4));
2458+
24562459
if(!parser_stack($6).operands().empty())
24572460
static_cast<exprt &>(parser_stack($$).add(ID_C_spec_loop_invariant)).operands().swap(parser_stack($6).operands());
24582461

@@ -2468,6 +2471,9 @@ iteration_statement:
24682471
statement($$, ID_dowhile);
24692472
parser_stack($$).add_to_operands(std::move(parser_stack($5)), std::move(parser_stack($2)));
24702473

2474+
if(!parser_stack($7).is_not_nil())
2475+
parser_stack($$).add(ID_C_spec_assigns).swap(parser_stack($7));
2476+
24712477
if(!parser_stack($8).operands().empty())
24722478
static_cast<exprt &>(parser_stack($$).add(ID_C_spec_loop_invariant)).operands().swap(parser_stack($8).operands());
24732479

@@ -2499,6 +2505,9 @@ iteration_statement:
24992505
mto($$, $7);
25002506
mto($$, $12);
25012507

2508+
if(!parser_stack($9).is_not_nil())
2509+
parser_stack($$).add(ID_C_spec_assigns).swap(parser_stack($9));
2510+
25022511
if(!parser_stack($10).operands().empty())
25032512
static_cast<exprt &>(parser_stack($$).add(ID_C_spec_loop_invariant)).operands().swap(parser_stack($10).operands());
25042513

@@ -3305,6 +3314,13 @@ cprover_contract_assigns:
33053314
;
33063315

33073316
cprover_contract_assigns_opt:
3317+
/* nothing */
3318+
{ init($$); parser_stack($$).make_nil(); }
3319+
| TOK_CPROVER_ASSIGNS '(' argument_expression_list ')'
3320+
{ $$=$3; }
3321+
;
3322+
3323+
cprover_contract_assigns_opt_old:
33083324
/* nothing */
33093325
{ init($$); parser_stack($$).make_nil(); }
33103326
| cprover_contract_assigns

src/goto-instrument/contracts/assigns.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ goto_programt assigns_clauset::havoc_code(
238238
return havoc_statements;
239239
}
240240

241+
std::vector<assigns_clause_targett *> assigns_clauset::getTargets()
242+
{
243+
return targets;
244+
}
245+
241246
exprt assigns_clauset::alias_expression(const exprt &lhs)
242247
{
243248
if(targets.empty())

src/goto-instrument/contracts/assigns.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class assigns_clauset
7373
irep_idt function_name,
7474
irep_idt language_mode);
7575
exprt alias_expression(const exprt &lhs);
76+
std::vector<assigns_clause_targett *> getTargets();
7677

7778
exprt compatible_expression(const assigns_clauset &called_assigns);
7879

src/goto-instrument/contracts/contracts.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ Date: February 2016
1212
/// Verify and use annotated invariants and pre/post-conditions
1313

1414
#include "contracts.h"
15+
<<<<<<< HEAD:src/goto-instrument/contracts/contracts.cpp
1516

17+
=======
18+
>>>>>>> b3b2ee77d... Adds a code contract module to goto-instrument:src/goto-instrument/contracts.cpp
1619
#include "assigns.h"
1720
#include "memory_predicates.h"
1821

0 commit comments

Comments
 (0)