Automatic inference of stationary fields: a generalization of java's final fields

C Unkel, MS Lam - Proceedings of the 35th annual ACM SIGPLAN …, 2008 - dl.acm.org
C Unkel, MS Lam
Proceedings of the 35th annual ACM SIGPLAN-SIGACT symposium on Principles of …, 2008dl.acm.org
Java programmers can document that the relationship between two objects is unchanging
by declaring the field that encodes that relationship to be final. This information can be used
in program understanding and detection of errors in new code additions. Unfortunately, few
fields in programs are actually declared final. Programs often contain fields that could be
final, but are not declared so. Moreover, the definition of final has restrictions on
initializationthat limit its applicability. We introduce stationary fields as a generalization of …
Java programmers can document that the relationship between two objects is unchanging by declaring the field that encodes that relationship to be final. This information can be used in program understanding and detection of errors in new code additions. Unfortunately, few fields in programs are actually declared final. Programs often contain fields that could be final, but are not declared so. Moreover, the definition of final has restrictions on initializationthat limit its applicability.
We introduce stationary fields as a generalization of final. A field in a program is stationary if, for every object that contains it, all writes to the field occur before all the reads. Unlike the definition of final fields, there can be multiple writes during initialization, and initialization can span multiple methods.
We have developed an efficient algorithm for inferring which fields are stationary in a program, based on the observation that many fields acquire their value very close to object creation. We presume that an object's initialization phase has concluded when its reference is saved in some heap object. We perform precise analysis only regarding recently created objects. Applying our algorithm to real-world Java programs demonstrates that stationary fields are more common than final fields: 44-59% vs. 11-17% respectively in our benchmarks.
These surprising results have several significant implications. First, substantial portions of Java programs appear to be written in a functional style. Second, initialization of these fields occurs very close to object creation, when very good alias information is available. These results open the door for more accurate and efficient pointer alias analysis.
ACM Digital Library