-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8355753: @SuppressWarnings("this-escape") not respected for indirect leak via field #24932
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
👋 Welcome back acobbs! A progress list of the required criteria for merging this PR into |
|
@archiecobbs This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be: You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 13 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. ➡️ To integrate this PR with the above commit message to the |
|
@archiecobbs The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
|
@archiecobbs This pull request has been inactive for more than 4 weeks and will be automatically closed if another 4 weeks passes without any activity. To avoid this, simply issue a |
|
/touch |
|
@archiecobbs The pull request is being re-evaluated and the inactivity timeout has been reset. |
|
|
||
| // Sort warnings so redundant warnings immediately follow whatever they are redundant for, then remove them | ||
| warningList.sort(Warning::sortByStackFrames); | ||
| AtomicReference<Warning> previousRef = new AtomicReference<>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just curious: why do we need to deal with AtomicReference here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @vicente-romero-oracle, thanks for taking a look.
The reason for the AtomicReference is that this lamba needs to be stateful (it needs to remember the most recent previous Warning that was also retained, if any), so if it wants to remain a lambda (i.e., and not a more verbose inner class) that state needs to be declared outside the lamba, and therefore it must be effectively final, which means there must be an extra level of indirection, etc. I guess it's a verbosity vs. clarity trade-off.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
right, would an array be less heavy? not beautiful either
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
right, would an array be less heavy? not beautiful either
If by "heavy" you mean optimization/efficiency, honestly I have no idea about that... that gets into a level of JVM optimization granularity beyond my knowledge.
As for "beauty", yes using an array is a common trick for this, but IMHO doing so is more obscure than using AtomicReference because there is no "arrayness" here. You are just using the array as a thing that contains a single mutable reference - i.e., exactly what AtomicReference does. Of course, we don't care about the "atomic" part, so that's slightly confusing too.
There's no perfect answer. It makes me wonder... maybe someday we could make stateful lambdas easier, e.g.:
Runnable r = () -> {
static int count;
System.out.println("Invoked " + ++count + " times");
};There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
right, definitely there is a need for stateful lambdas
| } | ||
| } | ||
|
|
||
| // JDK-8355753 - @SuppressWarnings("this-escape") not respected for indirect leak via field |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: consider adding a similar test case with an additional constructor that is not annotated with the @SuppressAnnotations annotation so that the warning is issued
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: consider adding a similar test case with an additional constructor that is not annotated with the @SuppressAnnotations annotation so that the warning is issued
and probably another variation doing something like:
private int x;
{
x = this.mightLeak();
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @vicente-romero-oracle, thanks for the suggestions. They should be implemented in 65e2679.
| if (diff != 0) | ||
| return diff; | ||
| } | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| }; | |
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks - fixed in f79e35f.
| return numExtra >= 0 && | ||
| IntStream.range(0, that.stack.size()) | ||
| .allMatch(index -> this.stack.get(numExtra + index).comparePos(that.stack.get(index)) == 0); | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| }; | |
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks - fixed in f79e35f.
vicente-romero-oracle
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
|
@archiecobbs thanks for the updates |
|
Thanks for the review! |
|
/integrate |
|
Going to push as commit 26275a1.
Your commit was automatically rebased without conflicts. |
|
@archiecobbs Pushed as commit 26275a1. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
This PR corrects a bug in the logic for handling
@SuppressWarnings("this-escape")when the leak is from a field initializer.The
ThisEscapeAnalyzerhas to do some custom handling for@SuppressWarnings("this-escape")because when a constructor executes, the actual path of execution can jump around between multiple constructors, field initializers, and initialization blocks. The previous logic was somewhat ad hoc and contained at least one bug (this one), so this PR refactors it to fix the bug and also make the code clearer.Now we "execute" field initializers and initialization blocks when we encounter
super()invocations, just like the actual JVM does, and we move the logics for (a) applying suppression and (b) the "at most one warning per constructor or initializer" rule until after the analysis, so they are part of the existing warning filtering and de-duplication step.Progress
Issue
Reviewers
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/24932/head:pull/24932$ git checkout pull/24932Update a local copy of the PR:
$ git checkout pull/24932$ git pull https://git.openjdk.org/jdk.git pull/24932/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 24932View PR using the GUI difftool:
$ git pr show -t 24932Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/24932.diff
Using Webrev
Link to Webrev Comment