From e734c1873d91b5990b528b5b980881123e4d83f2 Mon Sep 17 00:00:00 2001 From: jrm Date: Thu, 17 Mar 2016 19:03:46 -0700 Subject: [PATCH] Fix cases of resource leaks not detected when the resource indirectly implements Closeable Summary:public Before this diff, the Java frontend was not adding the definition of the inherited interfaces to the type environment, thus failing to answer questions like "does type X implements Closeable". Infer was therefore missing to detect resource leaks when the resource was indirectly implementing Closeable via an intermediate interface. Reviewed By: sblackshear Differential Revision: D3067555 fb-gh-sync-id: 86d0760 shipit-source-id: 86d0760 --- infer/src/java/jTransType.ml | 1 + .../build_systems/expected_outputs/ant_report.json | 5 +++++ .../build_systems/expected_outputs/buck_report.json | 5 +++++ .../java/infer/CloseableAsResourceExample.java | 10 ++++++++++ .../endtoend/java/infer/CloseableAsResourceTest.java | 1 + 5 files changed, 22 insertions(+) diff --git a/infer/src/java/jTransType.ml b/infer/src/java/jTransType.ml index 08d7e024a..48433695e 100644 --- a/infer/src/java/jTransType.ml +++ b/infer/src/java/jTransType.ml @@ -312,6 +312,7 @@ and create_sil_type program tenv cn = | None -> dummy_type cn | Some node -> let create_super_list interface_names = + IList.iter (fun cn -> ignore (get_class_type_no_pointer program tenv cn)) interface_names; IList.map typename_of_classname interface_names in let superclasses, instance_fields, static_fields, struct_annotations = match node with diff --git a/infer/tests/build_systems/expected_outputs/ant_report.json b/infer/tests/build_systems/expected_outputs/ant_report.json index 20401f563..47990ee44 100644 --- a/infer/tests/build_systems/expected_outputs/ant_report.json +++ b/infer/tests/build_systems/expected_outputs/ant_report.json @@ -399,6 +399,11 @@ "file": "codetoanalyze/java/infer/ResourceLeaks.java", "procedure": "void ResourceLeaks.jarOutputStreamLeak()" }, + { + "bug_type": "RESOURCE_LEAK", + "file": "codetoanalyze/java/infer/CloseableAsResourceExample.java", + "procedure": "void CloseableAsResourceExample.leakFoundWhenIndirectlyImplementingCloseable()" + }, { "bug_type": "RESOURCE_LEAK", "file": "codetoanalyze/java/infer/CursorLeaks.java", diff --git a/infer/tests/build_systems/expected_outputs/buck_report.json b/infer/tests/build_systems/expected_outputs/buck_report.json index 162bd24cb..22574d881 100644 --- a/infer/tests/build_systems/expected_outputs/buck_report.json +++ b/infer/tests/build_systems/expected_outputs/buck_report.json @@ -399,6 +399,11 @@ "file": "infer/tests/codetoanalyze/java/infer/ResourceLeaks.java", "procedure": "void ResourceLeaks.jarOutputStreamLeak()" }, + { + "bug_type": "RESOURCE_LEAK", + "file": "infer/tests/codetoanalyze/java/infer/CloseableAsResourceExample.java", + "procedure": "void CloseableAsResourceExample.leakFoundWhenIndirectlyImplementingCloseable()" + }, { "bug_type": "RESOURCE_LEAK", "file": "infer/tests/codetoanalyze/java/infer/CursorLeaks.java", diff --git a/infer/tests/codetoanalyze/java/infer/CloseableAsResourceExample.java b/infer/tests/codetoanalyze/java/infer/CloseableAsResourceExample.java index 73345af6c..5db3b779a 100644 --- a/infer/tests/codetoanalyze/java/infer/CloseableAsResourceExample.java +++ b/infer/tests/codetoanalyze/java/infer/CloseableAsResourceExample.java @@ -149,4 +149,14 @@ public class CloseableAsResourceExample { return null; } + interface MyCloseable extends Closeable {} + + class MyResource implements MyCloseable { + public void close() {} + } + + void leakFoundWhenIndirectlyImplementingCloseable() { + MyResource res = new MyResource(); + } + } diff --git a/infer/tests/endtoend/java/infer/CloseableAsResourceTest.java b/infer/tests/endtoend/java/infer/CloseableAsResourceTest.java index 795dc97db..013f2a8dc 100644 --- a/infer/tests/endtoend/java/infer/CloseableAsResourceTest.java +++ b/infer/tests/endtoend/java/infer/CloseableAsResourceTest.java @@ -43,6 +43,7 @@ public class CloseableAsResourceTest { "notClosingWrapper", "failToCloseWithCloseQuietly", "sourceOfNullWithResourceLeak", + "leakFoundWhenIndirectlyImplementingCloseable", }; assertThat( "Results should not contain resource leak errors",