1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
import org.checkerframework.common.aliasing.qual.*;
class UniqueAnnoTest {
// @Unique constructor
public @Unique UniqueAnnoTest() {}
// @Unique constructor leaking the "this" reference.
// Each unique.leaked error is a leak.
public @Unique UniqueAnnoTest(int i) {
notLeaked(this);
leakedToResult(this);
// :: error: (unique.leaked)
UniqueAnnoTest b = leakedToResult(this);
UniqueAnnoTest other = new UniqueAnnoTest();
// :: error: (unique.leaked)
other = this;
// :: error: (unique.leaked)
leaked(this);
// :: error: (unique.leaked)
leaked(other); // The receiver parameter is "this", so there is a leak.
}
// Not @Unique constructor. No warnings.
public UniqueAnnoTest(int i1, int i2) {
UniqueAnnoTest other = new UniqueAnnoTest();
other = this;
notLeaked(this);
}
void leaked(UniqueAnnoTest a) {}
void notLeaked(@NonLeaked UniqueAnnoTest this, @NonLeaked UniqueAnnoTest a) {}
UniqueAnnoTest leakedToResult(
@LeakedToResult UniqueAnnoTest this, @LeakedToResult UniqueAnnoTest a) {
return a;
}
}
|