Class InitializationStore<V extends CFAbstractValue<V>,S extends InitializationStore<V,S>>
java.lang.Object
org.checkerframework.framework.flow.CFAbstractStore<V,S>
org.checkerframework.checker.initialization.InitializationStore<V,S>
- All Implemented Interfaces:
Store<S>
,org.plumelib.util.UniqueId
- Direct Known Subclasses:
NullnessStore
public class InitializationStore<V extends CFAbstractValue<V>,S extends InitializationStore<V,S>>
extends CFAbstractStore<V,S>
A store that extends
CFAbstractStore
and additionally tracks which fields of the 'self'
reference have been initialized.- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.checkerframework.dataflow.analysis.Store
Store.FlowRule, Store.Kind
-
Field Summary
Modifier and TypeFieldDescriptionprotected final Set<VariableElement>
The set of fields that are initialized.protected final Map<FieldAccess,
V> The set of fields that have the 'invariant' annotation, and their value.Fields inherited from class org.checkerframework.framework.flow.CFAbstractStore
analysis, arrayValues, classValues, fieldValues, localVariableValues, methodValues, sequentialSemantics, thisValue
-
Constructor Summary
ConstructorDescriptionInitializationStore
(CFAbstractAnalysis<V, S, ?> analysis, boolean sequentialSemantics) Creates a new InitializationStore.InitializationStore
(S other) A copy constructor. -
Method Summary
Modifier and TypeMethodDescriptionvoid
Mark the field identified by the elementf
as initialized (the caller needs to ensure that the field belongs to the current class, or is a static field).void
addInitializedField
(FieldAccess field) Mark the field identified by the elementfield
as initialized if it belongs to the current class, or is static (in which case there is no aliasing issue and we can just add all static fields).CFAbstractAnalysis<V,
S, ?> Returns the analysis associated with this store.void
insertValue
(JavaExpression je, V value, boolean permitNondeterministic) protected String
internalVisualize
(CFGVisualizer<V, S, ?> viz) Adds a representation of the internal information of this Store to visualizerviz
.boolean
Is the field identified by the elementf
initialized?leastUpperBound
(S other) Compute the least upper bound of two stores.protected boolean
supersetOf
(CFAbstractStore<V, S> o) Returns true iff thisCFAbstractStore
contains a superset of the map entries of the argumentCFAbstractStore
.void
updateForMethodCall
(MethodInvocationNode n, AnnotatedTypeFactory atypeFactory, V val) Remove any information that might not be valid any more after a method call, and add information guaranteed by the method.Methods inherited from class org.checkerframework.framework.flow.CFAbstractStore
canAlias, canInsertJavaExpression, clearValue, computeNewValueAndInsert, copy, equals, getFieldValue, getFieldValues, getUid, getValue, getValue, getValue, getValue, getValue, getValue, hashCode, initializeMethodParameter, initializeThisValue, insertOrRefine, insertOrRefine, insertOrRefinePermitNondeterministic, insertThisValue, insertValue, insertValue, insertValuePermitNondeterministic, insertValuePermitNondeterministic, isMonotonicUpdate, isSideEffectFree, removeConflicting, removeConflicting, removeConflicting, replaceValue, shouldInsert, toString, updateForArrayAssignment, updateForAssignment, updateForFieldAccessAssignment, updateForLocalVariableAssignment, visualize, widenedUpperBound
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.plumelib.util.UniqueId
getClassAndUid
-
Field Details
-
initializedFields
The set of fields that are initialized. -
invariantFields
The set of fields that have the 'invariant' annotation, and their value.
-
-
Constructor Details
-
InitializationStore
Creates a new InitializationStore.- Parameters:
analysis
- the analysis class this store belongs tosequentialSemantics
- should the analysis use sequential Java semantics?
-
InitializationStore
A copy constructor.
-
-
Method Details
-
insertValue
Helper method forCFAbstractStore.insertValue(JavaExpression, CFAbstractValue)
andCFAbstractStore.insertValuePermitNondeterministic(org.checkerframework.dataflow.expression.JavaExpression, javax.lang.model.element.AnnotationMirror)
.Every overriding implementation should start with
if (!shouldInsert) { return; }
If the receiver is a field, and has an invariant annotation, then it can be considered initialized.
- Overrides:
insertValue
in classCFAbstractStore<V extends CFAbstractValue<V>,
S extends InitializationStore<V, S>> - Parameters:
je
- the expression to insert in the storevalue
- the value of the expressionpermitNondeterministic
- if false, does nothing ifexpr
is nondeterministic; if true, permits nondeterministic expressions to be placed in the store
-
updateForMethodCall
Remove any information that might not be valid any more after a method call, and add information guaranteed by the method.- If the method is side-effect-free (as indicated by
SideEffectFree
orPure
), then no information needs to be removed. - Otherwise, all information about field accesses
a.f
needs to be removed, except if the methodn
cannot modifya.f
(e.g., ifa
is a local variable orthis
, andf
is final). - Furthermore, if the field has a monotonic annotation, then its information can also be kept.
val
in the store.Additionally, the
InitializationStore
keeps all field values for fields that have the 'invariant' annotation.- Overrides:
updateForMethodCall
in classCFAbstractStore<V extends CFAbstractValue<V>,
S extends InitializationStore<V, S>> - Parameters:
n
- method whose information is being updatedatypeFactory
- the type factory of the associated checkerval
- abstract value of the method call
- If the method is side-effect-free (as indicated by
-
addInitializedField
Mark the field identified by the elementfield
as initialized if it belongs to the current class, or is static (in which case there is no aliasing issue and we can just add all static fields).- Parameters:
field
- a field that is initialized
-
addInitializedField
Mark the field identified by the elementf
as initialized (the caller needs to ensure that the field belongs to the current class, or is a static field).- Parameters:
f
- a field that is initialized
-
isFieldInitialized
Is the field identified by the elementf
initialized? -
supersetOf
Description copied from class:CFAbstractStore
Returns true iff thisCFAbstractStore
contains a superset of the map entries of the argumentCFAbstractStore
. Note that we test the entry keys and values by Java equality, not by any subtype relationship. This method is used primarily to simplify the equals predicate.- Overrides:
supersetOf
in classCFAbstractStore<V extends CFAbstractValue<V>,
S extends InitializationStore<V, S>>
-
leastUpperBound
Description copied from interface:Store
Compute the least upper bound of two stores.Important: This method must fulfill the following contract:
- Does not change
this
. - Does not change
other
. - Returns a fresh object which is not aliased yet.
- Returns an object of the same (dynamic) type as
this
, even if the signature is more permissive. - Is commutative.
- Specified by:
leastUpperBound
in interfaceStore<V extends CFAbstractValue<V>>
- Overrides:
leastUpperBound
in classCFAbstractStore<V extends CFAbstractValue<V>,
S extends InitializationStore<V, S>>
- Does not change
-
internalVisualize
Description copied from class:CFAbstractStore
Adds a representation of the internal information of this Store to visualizerviz
.- Overrides:
internalVisualize
in classCFAbstractStore<V extends CFAbstractValue<V>,
S extends InitializationStore<V, S>> - Parameters:
viz
- the visualizer- Returns:
- a representation of the internal information of this
Store
-
getAnalysis
Returns the analysis associated with this store.- Returns:
- the analysis associated with this store
-