RFR: 8015831: Add lint check for calling overridable methods from a constructor [v5]
Maurizio Cimadamore
mcimadamore at openjdk.org
Wed Jan 11 14:15:18 UTC 2023
On Wed, 11 Jan 2023 00:22:03 GMT, Archie L. Cobbs <duke at openjdk.org> wrote:
>> So, if the code was be like this:
>>
>>
>> ThisEscapeLoop ref11 = this;
>> ThisEscapeLoop ref12 = null;
>> ThisEscapeLoop ref13 = null;
>> ThisEscapeLoop ref14 = null;
>> for (int i = 0; i < 100; i++) {
>> ref14 = ref13;
>> ref13 = ref12;
>> ref12 = ref11;
>> ThisEscapeLoop ref21 = ref14;
>> ThisEscapeLoop ref22 = null;
>> ThisEscapeLoop ref23 = null;
>> ThisEscapeLoop ref24 = null;
>> for (int i = 0; i < 100; i++) {
>> ref24 = ref23;
>> ref23 = ref22;
>> ref22 = ref21;
>> if (ref24 != null)
>> ref24.mightLeak();
>> }
>> }
>>
>>
>> Then it would take not 3 iterations but 3 * 3 to figure out that it is a potential leak?
>
> Actually I think it would take 1 + 1 + 3 iterations.
>
> During the first two iterations of the outer loop, nothing changes after the first go round of the inner loop - i.e., the total set of possible references in existence does not change, because all of the assignments in the inner loop won't involve any 'this' references.
>
> It's only the during the third iteration of the outer loop that any 'this' references seep into any of the variables seen by the inner loop. Then it will take 3 cycles for the reference set to converge again.
>
> However, this is not to say that there aren't some pathological examples out there. I guess the question is could they exist in "normal" code.
True - probably 3 * 3 can be achieved if this:
ThisEscapeLoop ref21 = ref14;
Is replaced with
ThisEscapeLoop ref21 = this;
In which case the inner loop won't converge immediately (as it will have to propagate from ref21 to ref22 to ref23 to ref24).
I guess what I'm uncomfortable with is that we have effectively unbounded computation here (especially when we also consider the fact that the analysis "follows" method bodies as well, if they are found in the same compilation unit).
I suggest one experiment where you:
1. downgrade the warnings to notes (so that they won't make the JDK build fail)
2. enable this Lint everywhere
3. compare JDK `clean images` time w/ and w/o the Lint
-------------
PR: https://git.openjdk.org/jdk/pull/11874
More information about the serviceability-dev
mailing list