CBMC
|
#include <full_struct_abstract_object.h>
Public Member Functions | |
full_struct_abstract_objectt (const full_struct_abstract_objectt &ao) | |
Explicit copy-constructor to make it clear that the shared_map used to store the values of fields is copy-constructed as well to ensure it shares as much data as possible. | |
full_struct_abstract_objectt (const typet &type, bool top, bool bottom) | |
Start the abstract object at either top or bottom or neither asserts if both top and bottom are true. | |
full_struct_abstract_objectt (const exprt &expr, const abstract_environmentt &environment, const namespacet &ns) | |
void | output (std::ostream &out, const class ai_baset &ai, const class namespacet &ns) const override |
To provide a human readable string to the out representing the current known value about this object. | |
abstract_object_pointert | write_location_context (const locationt &location) const override |
Update the location context for an abstract object. | |
abstract_object_pointert | merge_location_context (const locationt &location) const override |
Update the merge location context for an abstract object. | |
abstract_object_pointert | visit_sub_elements (const abstract_object_visitort &visitor) const override |
Apply a visitor operation to all sub elements of this abstract_object. | |
void | statistics (abstract_object_statisticst &statistics, abstract_object_visitedt &visited, const abstract_environmentt &env, const namespacet &ns) const override |
![]() | |
abstract_aggregate_objectt (const typet &type, bool tp, bool bttm) | |
abstract_aggregate_objectt (const exprt &expr, const abstract_environmentt &environment, const namespacet &ns) | |
abstract_object_pointert | expression_transform (const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns) const override |
Interface for transforms. | |
abstract_object_pointert | write (abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &specifier, const abstract_object_pointert &value, bool merging_write) const override |
A helper function to evaluate writing to a component of an abstract object. | |
void | get_statistics (abstract_object_statisticst &statistics, abstract_object_visitedt &visited, const abstract_environmentt &env, const namespacet &ns) const override |
![]() | |
abstract_objectt (const typet &type, bool top, bool bottom) | |
Start the abstract object at either top or bottom or neither Asserts if both top and bottom are true. | |
abstract_objectt (const exprt &expr, const abstract_environmentt &environment, const namespacet &ns) | |
Construct an abstract object from the expression. | |
virtual | ~abstract_objectt () |
virtual const typet & | type () const |
Get the real type of the variable this abstract object is representing. | |
virtual bool | is_top () const |
Find out if the abstract object is top. | |
virtual bool | is_bottom () const |
Find out if the abstract object is bottom. | |
virtual exprt | to_constant () const |
Converts to a constant expression if possible. | |
exprt | to_predicate (const exprt &name) const |
Converts to an invariant expression. | |
virtual void | output (std::ostream &out, const class ai_baset &ai, const namespacet &ns) const |
Print the value of the abstract object. | |
virtual bool | has_been_modified (const abstract_object_pointert &before) const |
Determine whether 'this' abstract_object has been modified in comparison to a previous 'before' state. | |
virtual abstract_object_pointert | meet (const abstract_object_pointert &other) const |
Base implementation of the meet operation: only used if no more precise abstraction can be used, can only result in {TOP, BOTTOM, one of the original objects}. | |
abstract_object_pointert | make_top () const |
abstract_object_pointert | clear_top () const |
virtual abstract_object_pointert | unwrap_context () const |
virtual size_t | internal_hash () const |
virtual bool | internal_equality (const abstract_object_pointert &other) const |
Protected Member Functions | |
internal_abstract_object_pointert | mutable_clone () const override |
abstract_object_pointert | read_component (const abstract_environmentt &environment, const exprt &expr, const namespacet &ns) const override |
A helper function to evaluate the abstract object contained within a struct. | |
abstract_object_pointert | write_component (abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &expr, const abstract_object_pointert &value, bool merging_write) const override |
A helper function to evaluate writing to a component of a struct. | |
bool | verify () const override |
Function: full_struct_abstract_objectt::verify. | |
abstract_object_pointert | merge (const abstract_object_pointert &other, const widen_modet &widen_mode) const override |
To merge an abstract object into this abstract object. | |
exprt | to_predicate_internal (const exprt &name) const override |
to_predicate implementation - derived classes will override | |
![]() | |
abstract_object_pointert | abstract_object_merge (const abstract_object_pointert &other) const |
Create a new abstract object that is the result of the merge, unless the object would be unchanged, then would return itself. | |
bool | should_use_base_merge (const abstract_object_pointert &other) const |
To detect the cases where the base merge is sufficient to do a merge We can't do if this->is_bottom() since we want the specific. | |
abstract_object_pointert | abstract_object_meet (const abstract_object_pointert &other) const |
Helper function for base meet. | |
bool | should_use_base_meet (const abstract_object_pointert &other) const |
Helper function to decide if base meet implementation should be used. | |
void | set_top () |
void | set_not_top () |
void | set_not_bottom () |
Private Types | |
typedef sharing_mapt< irep_idt, abstract_object_pointert, false, irep_id_hash > | shared_struct_mapt |
Private Member Functions | |
abstract_object_pointert | merge_constant_structs (constant_struct_pointert other, const widen_modet &widen_mode) const |
Performs an element wise merge of the map for each struct. | |
Private Attributes | |
shared_struct_mapt | map |
Definition at line 18 of file full_struct_abstract_object.h.
typedef abstract_aggregate_objectt< full_struct_abstract_objectt, struct_aggregate_typet> full_struct_abstract_objectt::abstract_aggregate_baset |
Definition at line 27 of file full_struct_abstract_object.h.
typedef sharing_ptrt<full_struct_abstract_objectt> full_struct_abstract_objectt::constant_struct_pointert |
Definition at line 23 of file full_struct_abstract_object.h.
|
private |
Definition at line 102 of file full_struct_abstract_object.h.
full_struct_abstract_objectt::full_struct_abstract_objectt | ( | const full_struct_abstract_objectt & | ao | ) |
Explicit copy-constructor to make it clear that the shared_map used to store the values of fields is copy-constructed as well to ensure it shares as much data as possible.
Definition at line 24 of file full_struct_abstract_object.cpp.
full_struct_abstract_objectt::full_struct_abstract_objectt | ( | const typet & | type, |
bool | top, | ||
bool | bottom | ||
) |
Start the abstract object at either top or bottom or neither asserts if both top and bottom are true.
type | the type the abstract_object is representing |
top | is the abstract_object starting as top |
bottom | is the abstract_object starting as bottom |
Definition at line 30 of file full_struct_abstract_object.cpp.
full_struct_abstract_objectt::full_struct_abstract_objectt | ( | const exprt & | expr, |
const abstract_environmentt & | environment, | ||
const namespacet & | ns | ||
) |
expr | the expression to use as the starting pointer for an abstract object |
environment | the environment in which we evaluate expr |
ns | the current namespace |
Definition at line 40 of file full_struct_abstract_object.cpp.
|
overrideprotectedvirtual |
To merge an abstract object into this abstract object.
If the other is also a struct, we perform a constant_structs merge Otherwise we call back to the parent merge.
other | the other object being merged |
widen_mode | Indicates if this is a widening merge |
Reimplemented from abstract_objectt.
Definition at line 242 of file full_struct_abstract_object.cpp.
|
private |
Performs an element wise merge of the map for each struct.
other | the other object being merged |
widen_mode | Indicates if this is a widening merge |
Definition at line 254 of file full_struct_abstract_object.cpp.
|
overridevirtual |
Update the merge location context for an abstract object.
location | the location to be updated |
Reimplemented from abstract_objectt.
Definition at line 286 of file full_struct_abstract_object.cpp.
|
inlineoverrideprotectedvirtual |
Reimplemented from abstract_objectt.
Definition at line 118 of file full_struct_abstract_object.h.
|
override |
To provide a human readable string to the out representing the current known value about this object.
For this array we print: { .component_name=<output of object for component_name... }
out | the stream to write to |
ai | the abstract interpreter that contains the abstract domain (that contains the object ... ) |
ns | the current namespace |
Definition at line 201 of file full_struct_abstract_object.cpp.
|
overrideprotectedvirtual |
A helper function to evaluate the abstract object contained within a struct.
More precise abstractions may override this to return more precise results.
environment | the abstract environment |
expr | the expression uses to access a specific component |
ns | the current namespace |
Reimplemented from abstract_aggregate_objectt< full_struct_abstract_objectt, struct_aggregate_typet >.
Definition at line 71 of file full_struct_abstract_object.cpp.
|
overridevirtual |
Implements abstract_aggregate_objectt< full_struct_abstract_objectt, struct_aggregate_typet >.
Definition at line 326 of file full_struct_abstract_object.cpp.
|
overrideprotectedvirtual |
to_predicate implementation - derived classes will override
name | - the variable name to substitute into the expression |
Reimplemented from abstract_objectt.
Definition at line 303 of file full_struct_abstract_object.cpp.
|
overrideprotectedvirtual |
Function: full_struct_abstract_objectt::verify.
To validate that the struct object is in a valid state. This means either it is top or bottom, or if neither of those then there exists something in the map of components. If there is something in the map, then it can't be top or bottom
Reimplemented from abstract_objectt.
Definition at line 235 of file full_struct_abstract_object.cpp.
|
overridevirtual |
Apply a visitor operation to all sub elements of this abstract_object.
A sub element might be a member of a struct, or an element of an array, for instance, but this is entirely determined by the particular derived instance of abstract_objectt.
visitor | an instance of a visitor class that will be applied to all sub elements |
Reimplemented from abstract_objectt.
Definition at line 292 of file full_struct_abstract_object.cpp.
|
overrideprotectedvirtual |
A helper function to evaluate writing to a component of a struct.
More precise abstractions may override this to update what they are storing for a specific component.
environment | the abstract environment |
ns | the current namespace |
stack | the remaining stack of expressions on the LHS to evaluate |
expr | the expression uses to access a specific component |
value | the value we are trying to write to the component |
merging_write | whether to over-write or to merge with the current value. In other words is there any certainty that this write will happen. |
Reimplemented from abstract_aggregate_objectt< full_struct_abstract_objectt, struct_aggregate_typet >.
Definition at line 106 of file full_struct_abstract_object.cpp.
|
overridevirtual |
Update the location context for an abstract object.
location | the location to be updated |
Reimplemented from abstract_objectt.
Definition at line 280 of file full_struct_abstract_object.cpp.
|
private |
Definition at line 103 of file full_struct_abstract_object.h.