| \htmlhr |
| \chapterAndLabel{Initialized Fields Checker}{initialized-fields-checker} |
| |
| The Initialized Fields Checker warns if a constructor does not initialize a |
| field. |
| |
| |
| \sectionAndLabel{Running the Initialized Fields Checker}{initialized-fields-checker-running} |
| |
| An example invocation is |
| |
| \begin{Verbatim} |
| javac -processor org.checkerframework.common.initializedfields.InitializedFieldsChecker MyFile.java |
| \end{Verbatim} |
| |
| If you run it together with other checkers, then it issues warnings only if |
| the default value assigned by Java (0, false, or null) is not consistent |
| with the field's annotation, for the other checkers. |
| % It's actually the checkers and their subcheckers if any. Saying that |
| % would be confusing to most users, who don't know what a "subchecker" is. |
| % The term "subchecker" appears only in the "creating a checker" section of |
| % the manual. |
| An example invocation is |
| |
| \begin{Verbatim} |
| javac -processor ValueChecker,InitializedFieldsChecker MyFile.java |
| \end{Verbatim} |
| |
| |
| \sectionAndLabel{Motivation: uninitialized fields}{initialized-fields-motivation} |
| |
| Without the Initialized Fields Checker, every type system is |
| unsound with respect to fields that are never set. (Exception: The |
| Nullness Checker (\chapterpageref{nullness-checker}) is sound. Also, a type |
| system is sound if every annotation is consistent with 0, false, and null.) |
| Consider the following code: |
| |
| \begin{Verbatim} |
| import org.checkerframework.checker.index.qual.Positive; |
| |
| class MyClass { |
| @Positive int x; |
| MyClass() { |
| // empty body |
| } |
| |
| @Positive int getX() { |
| return x; |
| } |
| } |
| \end{Verbatim} |
| |
| \noindent |
| Method \<getX> is incorrect because it returns 0, which is not positive. |
| However, the code type-checks because there is never an assignment to \<x> |
| whose right-hand side is not positive. |
| If you run the Index Checker together with the Initialized Fields Checker, |
| then the code correctly does not type-check. |
| |
| |
| \subsubsectionAndLabel{Remaining unsoundness}{initialized-fields-remaining-unsoundness} |
| |
| Even with the Initialized Fields Checker, every type system (except the |
| Nullness Checker, \chapterpageref{nullness-checker}) is unsound with |
| respect to partially-initialized fields. Consider the following code: |
| |
| \begin{Verbatim} |
| import org.checkerframework.checker.index.qual.Positive; |
| |
| class MyClass { |
| @Positive int x; |
| MyClass() { |
| foo(this); |
| x = 1; |
| } |
| |
| @Positive int foo() { |
| // ... use x, expecting it to be positive ... |
| } |
| } |
| \end{Verbatim} |
| |
| \noindent |
| Within method \<foo>, \<x> can have the value 0 even though the type of |
| \<x> is \<@Positive int>. |
| |
| |
| \sectionAndLabel{Example}{initialized-fields-example} |
| |
| As an example, consider the following code: |
| |
| \begin{Verbatim} |
| import org.checkerframework.checker.index.qual.Positive; |
| |
| class MyClass { |
| |
| @Positive int x; |
| @Positive int y; |
| int z; |
| |
| // Warning: field y is not initialized |
| MyClass() { |
| x = 1; |
| } |
| } |
| \end{Verbatim} |
| |
| When run by itself, the Initialized Fields Checker warns that fields \<y> |
| and field \<z> are not set. |
| |
| When run together with the Index Checker, the Initialized Fields Checker |
| warns that field \<y> is not set. It does not warn about field \<z>, |
| because its default value (0) is consistent with its annotations. |
| |
| |
| \sectionAndLabel{Annotations}{initialized-fields-annotations} |
| |
| The Initialized Fields type system uses the following type annotations: |
| \begin{description} |
| \item[\refqualclass{common/initializedfields/qual}{InitializedFields}] |
| indicates which fields have definitely been initialized so far. |
| \item[\refqualclass{common/initializedfields/qual}{InitializedFieldsBottom}] |
| is the type of \<null>. Programmers rarely write this type. |
| \item[\refqualclass{common/initializedfields/qual}{PolyInitializedFields}] |
| is a qualifier that is polymorphic over field initialization. |
| For a description of qualifier polymorphism, see |
| Section~\ref{method-qualifier-polymorphism}. |
| \end{description} |
| |
| \begin{figure} |
| \includeimage{initializedfields}{4.5cm} |
| \caption{The type qualifier hierarchy of the Initialized Fields Checker. |
| \<@InitializedFieldsBottom> is rarely written by a programmer.} |
| \label{fig-initialized-fields-hierarchy} |
| \end{figure} |
| |
| Figure~\ref{fig-initialized-fields-hierarchy} shows the the subtyping |
| relationships among the type qualifiers. |
| |
| There is also a method declaration annotation: |
| |
| \begin{description} |
| \item[\refqualclass{common/initializedfields/qual}{EnsuresInitializedFields}] |
| indicates which fields the method sets. Use this for helper methods that |
| are called from a constructor. |
| \end{description} |
| |
| |
| \sectionAndLabel{Comparison to the Initialization Checker}{initialized-fields-vs-initialization} |
| |
| The Initialized Fields Checker is a lightweight version of the Initialization Checker |
| (Section~\ref{initialization-checker}). Here is a comparison between them. |
| |
| \noindent |
| \begin{small} |
| \begin{tabular}{| l | l | l |} |
| \hline |
| & Initialization Checker & Initialized Fields Checker |
| \\ \hline |
| superclasses |
| & tracks initialization of supertype fields |
| & checks one class at a time |
| \\ |
| partial initialization |
| & changes the types of fields that are not initialized |
| & unsound treatment of partially-initialized objects (*) |
| \\ |
| type systems |
| & works only with the Nullness Checker (**) |
| & works for any type system |
| \\ |
| disabling |
| & always runs with the Nullness Checker |
| & can be enabled/disabled per run |
| \\ |
| \hline |
| \end{tabular} |
| |
| \noindent |
| * See Section~\ref{initialized-fields-remaining-unsoundness} for an example. |
| \newline |
| ** The Initialization Checker could be made to work with any type system, but |
| doing so would require changing the implementation of both the type system and |
| the Initialization Checker. |
| \end{small} |
| |
| |
| % LocalWords: InitializedFields getX |
| % LocalWords: InitializedFieldsBottom PolyInitializedFields |
| % LocalWords: EnsuresInitializedFields |