From c5088f44a74f23492e1cce586106e48d4c77de71 Mon Sep 17 00:00:00 2001 From: Sam Blackshear Date: Tue, 23 Aug 2016 17:43:21 -0700 Subject: [PATCH] adding tests for context leaks via weak reference Reviewed By: lazaroclapp Differential Revision: D3760191 fbshipit-source-id: fd9ed1d --- .../java/infer/ContextLeaks.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/infer/tests/codetoanalyze/java/infer/ContextLeaks.java b/infer/tests/codetoanalyze/java/infer/ContextLeaks.java index 5fb3ace11..bce42a31f 100644 --- a/infer/tests/codetoanalyze/java/infer/ContextLeaks.java +++ b/infer/tests/codetoanalyze/java/infer/ContextLeaks.java @@ -9,6 +9,8 @@ package codetoanalyze.java.infer; +import java.lang.ref.WeakReference; + import android.content.Context; import android.app.Activity; @@ -90,4 +92,30 @@ public class ContextLeaks extends Activity { return Singleton.getInstance(this.getApplicationContext()); } + // testing that we don't report on static field -> ... -> Context paths broken by weak refs + static WeakReference sDirectWeakReference; + + static WeakReference sIndirectWeakReference1; + + static Obj sIndirectWeakReference2; + + // sDirectWeakReference |-> WeakReference.referent |-> Context + public void directWeakReferenceOk() { + sDirectWeakReference = new WeakReference(this); + } + + // sIndirectWeakReference1 |-> WeakReference.referent |-> Obj.f |-> Context + public void indirectWeakReferenceOk1() { + Obj obj = new Obj(); + obj.f = this; + sIndirectWeakReference1 = new WeakReference(obj); + } + + // sIndirectWeakReference2.|-> Obj.f |-> WeakReference.referent |-> Context + public void indirectWeakReferenceOk2() { + Obj obj = new Obj(); + obj.f = new WeakReference(this); + sIndirectWeakReference2 = obj; + } + }