-
Notifications
You must be signed in to change notification settings - Fork 352
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
Initialization problem in while true loop #1727
Comments
javac compiler has special handling for class B {
}
public class Bug {
private B foo(int x, int y) {
B b;
while (x==y) {// This line is not always true
B op = getB();
if (op == null) {
b = new B();
break;
}else{
b = op;
break;
}
}
return b;
}
private B getB() {return new B();}
} And after I ran:
This makes sense, because if But if we change |
Thanks for filing this :) I just encountered the same thing, and once I minimized it, I was able to find this existing issue. Here's what I ended up with: $ cat AssignAndBreak.java
class AssignAndBreak {
void foo() {
Object e;
while (true) {
e = "";
break;
}
e.toString();
}
}
FYI, we saw it in our |
Sorry, I forgot to add: I had hoped that switching to |
This PR fixes both issue #3249 and issue #1727, by adapting the CFG in the following way: If the loop condition is checked to be a constant true (according to the same logic in javac flow analysis), then the loop condition does not have an else-branch, i.e. the block holding the loop condition is directly followed by the one holding the loop entry, instead of followed by a conditional block. Fixes #1727 and Fixes #3249`
Testcase(please remove txt file extension after download):
Bug.java.txt
Command I used:
javac -processor nullness testinput/typecheck/Bug.java -version -verbose -AprintErrorStack -AprintAllQualifiers
Console Output:
Expected: no errors
Actual: return type incompatible on line 22.
Reasoning:
while(true)
loop is guaranteed to be executed and both branches(if&else) initializes b to be a@NonNull
value. So at line 22,b
's type should be@Initialized @NonNull
.The text was updated successfully, but these errors were encountered: