module Property_status:sig..end
Status of properties.
A local status (shortly, a status) of a property is a status directly set by an emitter. Thus a property may have several distinct status according to who attempts the verification.
type emitted_status =
| |
True |
(* | for each execution path | *) |
| |
False_if_reachable |
(* | for each execution path | *) |
| |
False_and_reachable |
(* | it exists an execution path | *) |
| |
Dont_know |
(* | any other case | *) |
Type of status emitted by analyzers. Each Property is attached to a program
point s and implicitly depends on an execution path from the program
entry point to s. It also depends on an explicit set of hypotheses H
indicating when emitting the property (see function Property_status.emit).
module Emitted_status:Datatype.Swith type t = emitted_status
exception Inconsistent_emitted_status of emitted_status * emitted_status
val emit : Emitter.t ->
hyps:Property.t list ->
Property.t -> ?distinct:bool -> emitted_status -> unitemit e ~hyps p s indicates that the status of p is s, is emitted by
e, and is based on the list of hypothesis hyps. If e previously
emitted another status s', it must be emitted with the same hypotheses and
a consistency check is performed between s and s' and the best (by
default the strongest) status is kept. If distinct is true (default is
false), then we consider than the given status actually merges several
statuses coming from distinct execution paths. The strategy for computing
the best status is changed accordingly. One example when ~distinct:true
may be required is when emitting a status for a pre-condition of a function
f since the status associated to a pre-condition p merges all statuses
of p at each callsite of the function f.
Inconsistent_emitted_status when emitting False after emitting True
or converselyval emit_and_get : Emitter.t ->
hyps:Property.t list ->
Property.t ->
?distinct:bool ->
emitted_status -> emitted_statusLike Property_status.emit but also returns the computed status.
val logical_consequence : Emitter.t -> Property.t -> Property.t list -> unitlogical_consequence e ppt list indicates that the emitter e considers
that ppt is a logical consequence of the conjunction of properties
list. Thus it lets the kernel automatically computes it: e must not call
functions emit* itself on this property, but the kernel ensures that the
status will be up-to-date when getting it.
val legal_dependency_cycle : Emitter.t -> Property.Set.t -> unitThe given properties may define a legal dependency cycle for the given emitter.
val self : State.tThe state which stores the computed status.
type emitter_with_properties = private {
|
emitter : |
|||
|
mutable properties : |
|||
|
logical_consequence : |
(* | Is the emitted status automatically inferred? | *) |
}
type inconsistent = private {
|
valid : |
|
invalid : |
}
type status = private
| |
Never_tried |
(* | Nobody tries to verify the property | *) |
| |
Best of |
(* |
| *) |
| |
Inconsistent of |
(* | someone locally says the property is valid and someone else says it is invalid: only the consolidated status may conclude. | *) |
Type of the local status of a property.
include Datatype.S
val get : Property.t -> statusProperty_status.Consolidation.get if you want to know the
consolidated status of the property.Iteration on all the individual statuses emitted for the given property.
val iter_on_statuses : (emitter_with_properties ->
emitted_status -> unit) ->
Property.t -> unit
val fold_on_statuses : (emitter_with_properties ->
emitted_status -> 'a -> 'a) ->
Property.t -> 'a -> 'amodule Consolidation:sig..end
Consolidation of a property status according to the (consolidated) status of the hypotheses of the property.
module Feedback:sig..end
Lighter version than Consolidation
module Consolidation_graph:sig..end
See the consolidated status of a property in a graph, which all its dependencies and their consolidated status.
val iter : (Property.t -> unit) -> unit
val fold : (Property.t -> 'a -> 'a) -> 'a -> 'a
val iter_sorted : cmp:(Property.t -> Property.t -> int) -> (Property.t -> unit) -> unitval fold_sorted : cmp:(Property.t -> Property.t -> int) -> (Property.t -> 'a -> 'a) -> 'a -> 'aval register : Property.t -> unitRegister the given property. It must not be already registered.
val register_property_add_hook : (Property.t -> unit) -> unitadd an hook that will be called for any newly registered property
val remove : Property.t -> unitRemove the property deeply. Must be called only when removing the corresponding annotation.
val register_property_remove_hook : (Property.t -> unit) -> unitAdd and hook that will be called each time a property is removed.
val merge : old:Property.t list -> Property.t list -> unitmerge old new registers properties in new which are not in old and
removes properties in old which are not in new.
val automatically_computed : Property.t -> boolIs the status of the given property only automatically handled by the kernel?