#include <abstract_environment.h>
Definition at line 38 of file abstract_environment.h.
Definition at line 41 of file abstract_environment.h.
Definition at line 45 of file abstract_environment.h.
Look at the configuration for the sensitivity and create an appropriate abstract_object.
Definition at line 336 of file abstract_environment.cpp.
For converting constants in the program.
Look at the configuration for the sensitivity and create an appropriate abstract_object, assigning an appropriate value Maybe the two abstract_object_factory methods should be compacted to one call...
Definition at line 328 of file abstract_environment.cpp.
Look at the configuration for the sensitivity and create an appropriate abstract_object.
Definition at line 317 of file abstract_environment.cpp.
Assign a value to an expression.
Assign is in principe simple, it updates the map with the new abstract object. The challenge is how to handle write to compound objects, for example: a[i].x.y = 23; In this case we clearly want to update a, but we need to delegate to the object in a so that it updates the right part of it (depending on what kind of array abstraction it is). So, as we find the variable ('a' in this case) we build a stack of which part of it is accessed.
As abstractions may split the assignment into multiple writes (for example pointers that could point to several locations, arrays with non-constant indexes), each of which has to handle the rest of the compound write, thus the stack is passed (to write, which does the actual updating) as an explicit argument rather than just via recursion.
The same use case (but for the opposite reason; because you will only update one of the multiple objects) is also why a merge_write flag is needed.
Definition at line 154 of file abstract_environment.cpp.
Reduces the domain based on a condition.
Reduces the domain to (an over-approximation) of the cases when the the expression holds. Used to implement assume statements and conditional branches. It would be valid to simply return false here because it is an over-approximation. We try to do better than that. The better the implementation the more precise the results will be.
Definition at line 263 of file abstract_environment.cpp.
Exposes the environment configuration.
Definition at line 348 of file abstract_environment.cpp.
Definition at line 305 of file abstract_environment.cpp.
Delete a symbol from the map.
This is necessary if the symbol falls out of scope and should no longer be tracked.
Definition at line 481 of file abstract_environment.cpp.
These three are really the heart of the method.
Evaluate the value of an expression relative to the current domain
Definition at line 101 of file abstract_environment.cpp.
Definition at line 466 of file abstract_environment.cpp.
Definition at line 532 of file abstract_environment.cpp.
This should be used as a default case / everything else has failed The string is so that I can easily find and diagnose cases where this occurs.
Set the domain to top
Definition at line 384 of file abstract_environment.cpp.
Gets whether the domain is bottom.
Definition at line 403 of file abstract_environment.cpp.
Gets whether the domain is top.
Definition at line 408 of file abstract_environment.cpp.
Set the domain to top (i.e. no possible states / unreachable)
Definition at line 397 of file abstract_environment.cpp.
Set the domain to top (i.e. everything)
Definition at line 390 of file abstract_environment.cpp.
Computes the join between "this" and "b".
Definition at line 353 of file abstract_environment.cpp.
For our implementation of variable sensitivity domains, we need to be able to efficiently find symbols that have changed between different domains.
To do this, we need to be able to quickly find which symbols have new written locations, which we do by finding the intersection between two different domains (environments).
Inputs are two abstract_environmentt's that need to be intersected for, so that we can find symbols that have changed between different domains.
Definition at line 487 of file abstract_environment.cpp.
Print out all the values in the abstract object map.
Definition at line 413 of file abstract_environment.cpp.
Definition at line 142 of file abstract_environment.cpp.
Gives a boolean condition that is true for all values represented by the environment.
Definition at line 430 of file abstract_environment.cpp.
Check the structural invariants are maintained.
In this case this is checking there aren't any null pointer mapped values
Definition at line 454 of file abstract_environment.cpp.
Used within assign to do the actual dispatch.
Write an abstract object onto another respecting a stack of member, index and dereference access. This ping-pongs between this method and the relevant write methods in abstract_struct, abstract_pointer and abstract_array until the stack is empty
Definition at line 243 of file abstract_environment.cpp.
Definition at line 251 of file abstract_environment.h.
Definition at line 260 of file abstract_environment.h.
Definition at line 285 of file abstract_environment.h.