| Version 1 (modified by , 10 years ago) ( diff ) |
|---|
contract clauses
requires e;: precondition,eshould hold at the entry of the functionterminates e;:decreases e ;ordecreases e for r;: decreases clause, whereeis an expression of typeTandris an relation overT- simple clauses:
ensures e;assumes e;assigns e0, e1, ...;allocates e0, e1, ...;frees e0, e1, ...;guards e;reads e0, e1, ...;depends e0, e1, ...;
- action expressions:
read(e):ehas typeMem. The function reads the memory units specified bye.write(e):ehas typeMem. The function writes the memory units specified bye.call(f, <e1, ...>):fhas typeFunction. The function callsfwith parameterse1, ....noaction: no actionanyaction: all actionsact_union(ma0, ma1): the union of the two memory set actionsma0andma1.act_comp(ma0, ma1): action complement (everything not inma1)act_isect(ma0, ma1): action intersection
- depends clause:
depends action0, action1, action2, ...- Example:
depends act_union(act_comp(read(n), call(inc, <x>))), call(dec, <y>)) - absence of depends clause: there is no information about the dependency of the function, which means that the analysis needs to figure it out by itself.
- Example:
- some facts about assigns-or-reads clause
- absence of
reads/assignsclause: there is no assumption about the read/assign access of the function, i.e., the function could read/assign anything- absence of
assignsclause: similar to the absence ofreadsclause
- absence of
reads/assigns nothingdoesn’t necessarily means that the function never reads or assigns any variable. The function could still reads/assigns its “local” variables, including function parameters and any variable declared inside the function body. check it
- absence of
- For an independent function which has
depends coaction, usually we also need to specifyreads nothing, for the purpose of reachability analysis.
e.g.,
/* Returns the size of the given bundle b. */ bundle_size(Bundle b): Integer depends nothing reads b ;
- Example of a function declaration with contracts:
fun[atomic] sendRecv(Int cmd, Pointer buf): Integer reads deref(buf); behavior send: depends writes(buf); assigns nothing; behavior receive: depends access(deref(buf)); assigns deref(buf); { begin choose when eq(cmd, 0) do CALL send, <buf, ...>; goto L1; when eq(cmd, 1) do CALL recv, <buf, ...>; goto L1; when and(neq(cmd, 0), neq(cmd, 1)) do NOOP; goto L1; end choose L1: }
Note:
See TracWiki
for help on using the wiki.
