From b1678882b399924b46a127c29143d223254969dc Mon Sep 17 00:00:00 2001 From: Ben Liblit Date: Sun, 12 Mar 2017 00:44:55 -0600 Subject: [PATCH] Plug numerous potential resource leaks This fixes 33 out of 37 Eclipse "Potential resource leak: '...' may not be closed" warnings. It also fixes 3 out of 37 Eclipse "Resource '...' should be managed by try-with-resource" warnings, although that was not the main focus of this effort. The remaining 4 warnings about potential resource leaks all involve a leaked JarFile instance that is passed to a JarFileModule constructor call. JarFileModile never attempts to close its underlying JarFile; this code is written as though JarFile cleanup were the caller's responsibility. However, the JarFile often cannot be closed by the code that creates the JarFileModule either, since the JarFile needs to remain open while the JarFileModule is in use, and some of these JarFileModules stay around beyond the lifetime of the code that created them. Truly fixing this would essentially require making JarFileModule implement Closeable, which in turn would probably require that Module implement Closeable, which in turn would require changes to lots of code that deals with Module instances to arrange for them to be properly closed. That's more invasive than I'm prepared to take on right now. --- .../java/client/JavaSourceAnalysisEngine.java | 5 +- .../cast/js/html/DomLessSourceExtractor.java | 31 +++++----- .../com/ibm/wala/cast/util/CAstPrinter.java | 16 ++--- .../wala/core/tests/ir/CFGSanitizerTest.java | 6 +- .../wala/core/tests/slicer/SlicerTest.java | 5 +- .../analysis/SimpleThreadEscapeAnalysis.java | 4 +- .../callGraph/DalvikCallGraphTestBase.java | 5 +- .../dalvik/classLoader/DexFileModule.java | 4 +- .../dalvik/util/AndroidAnalysisScope.java | 9 ++- .../dalvik/util/AndroidManifestXMLReader.java | 4 +- .../wala/cast/java/test/JDTJavaIRTests.java | 11 +++- .../ide/jsdt/tests/JSProjectScopeTest.java | 11 +++- .../wala/ide/tests/util/EclipseTestUtil.java | 13 ++-- .../client/EclipseProjectAnalysisEngine.java | 5 +- .../wala/ide/util/EclipseFileProvider.java | 9 ++- .../util/AndroidAnalysisContext.java | 27 +++------ .../org/scandroid/util/CGAnalysisContext.java | 4 +- .../wala/shrike/bench/AddBytecodeDebug.java | 18 +++--- .../src/com/ibm/wala/shrike/bench/Bench.java | 31 +++++----- .../com/ibm/wala/shrike/bench/Mangler.java | 34 +++++------ .../shrike/cg/OfflineDynamicCallGraph.java | 59 ++++++++++--------- .../src/com/ibm/wala/shrike/cg/Runtime.java | 4 +- .../shrikeCT/tools/AddSerialVersion.java | 4 +- .../shrikeCT/tools/BatchVerifier.java | 21 +++---- .../shrikeCT/tools/BootstrapDumper.java | 22 +++---- .../shrikeBT/shrikeCT/tools/MethodTracer.java | 15 ++--- .../tools/OfflineInstrumenterBase.java | 6 +- .../com/ibm/wala/util/tables/StringTable.java | 4 +- 28 files changed, 213 insertions(+), 174 deletions(-) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java index 20e9f2cee..2513552f2 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java @@ -111,8 +111,9 @@ public abstract class JavaSourceAnalysisEngine extends Ab scope = makeSourceAnalysisScope(); if (getExclusionsFile() != null) { - InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile()); - scope.setExclusions(new FileOfClasses(is)); + try (final InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile())) { + scope.setExclusions(new FileOfClasses(is)); + } } for (Module M : this.systemEntries) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index 4e33691e1..91f821712 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -251,16 +251,15 @@ public class DomLessSourceExtractor extends JSSourceExtractor { private void getScriptFromUrl(String urlAsString, ITag scriptTag) throws IOException, MalformedURLException { URL scriptSrc = new URL(entrypointUrl, urlAsString); - Reader scriptInputStream; + BOMInputStream bs; try { - BOMInputStream bs = new BOMInputStream(scriptSrc.openConnection().getInputStream(), false, + bs = new BOMInputStream(scriptSrc.openConnection().getInputStream(), false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_32LE, ByteOrderMark.UTF_32BE); if (bs.hasBOM()) { System.err.println("removing BOM " + bs.getBOM()); } - scriptInputStream = new InputStreamReader(bs); } catch (Exception e) { //it looks like this happens when we can't resolve the url? if (DEBUG) { @@ -270,22 +269,17 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } return; } - - BufferedReader scriptReader = null; - try { + try ( + final Reader scriptInputStream = new InputStreamReader(bs); + final BufferedReader scriptReader = new BufferedReader(scriptInputStream); + ) { String line; - scriptReader = new BufferedReader(scriptInputStream); StringBuffer x = new StringBuffer(); while ((line = scriptReader.readLine()) != null) { x.append(line).append("\n"); } scriptRegion.println(x.toString(), scriptTag.getElementPosition(), scriptSrc, false); - - } finally { - if (scriptReader != null) { - scriptReader.close(); - } } } @@ -329,9 +323,11 @@ public class DomLessSourceExtractor extends JSSourceExtractor { public Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error { - Reader inputStreamReader = WebUtil.getStream(entrypointUrl); - IGeneratorCallback htmlCallback = createHtmlCallback(entrypointUrl, urlResolver); - htmlParser.parse(entrypointUrl, inputStreamReader, htmlCallback, entrypointUrl.getFile()); + IGeneratorCallback htmlCallback; + try (Reader inputStreamReader = WebUtil.getStream(entrypointUrl)) { + htmlCallback = createHtmlCallback(entrypointUrl, urlResolver); + htmlParser.parse(entrypointUrl, inputStreamReader, htmlCallback, entrypointUrl.getFile()); + } SourceRegion finalRegion = new SourceRegion(); htmlCallback.writeToFinalRegion(finalRegion); @@ -339,7 +335,10 @@ public class DomLessSourceExtractor extends JSSourceExtractor { // writing the final region into one SourceFileModule. File outputFile = createOutputFile(entrypointUrl, DELETE_UPON_EXIT, USE_TEMP_NAME); tempFile = outputFile; - FileMapping fileMapping = finalRegion.writeToFile(new PrintWriter(new FileWriter(outputFile))); + FileMapping fileMapping; + try (final PrintWriter printer = new PrintWriter(new FileWriter(outputFile))) { + fileMapping = finalRegion.writeToFile(printer); + } if (fileMapping == null) { fileMapping = new EmptyFileMapping(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java index e5583ff55..2651647e3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java @@ -28,17 +28,17 @@ public class CAstPrinter { } @Override - public void write(char[] cbuf, int off, int len) throws IOException { + public void write(char[] cbuf, int off, int len) { sb.append(new String(cbuf, off, len)); } @Override - public void flush() throws IOException { + public void flush() { // do nothing } @Override - public void close() throws IOException { + public void close() { // do nothing } } @@ -146,15 +146,17 @@ public class CAstPrinter { public String doPrint(CAstNode top, CAstSourcePositionMap pos) { final StringBuffer sb = new StringBuffer(); - Writer writer = new StringWriter(sb); - printTo(top, pos, writer); + try (final StringWriter writer = new StringWriter(sb)) { + printTo(top, pos, writer); + } return sb.toString(); } public String doPrint(CAstEntity ce) { final StringBuffer sb = new StringBuffer(); - StringWriter writer = new StringWriter(sb); - printTo(ce, writer); + try (final StringWriter writer = new StringWriter(sb)) { + printTo(ce, writer); + } return sb.toString(); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/CFGSanitizerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/CFGSanitizerTest.java index 6d7e7467b..343edeeb4 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/CFGSanitizerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/CFGSanitizerTest.java @@ -58,8 +58,10 @@ public class CFGSanitizerTest extends WalaTestCase { ClassHierarchy cha = ClassHierarchyFactory.make(scope); ClassLoader cl = CFGSanitizerTest.class.getClassLoader(); - InputStream s = cl.getResourceAsStream("natives.xml"); - XMLMethodSummaryReader summary = new XMLMethodSummaryReader(s, scope); + XMLMethodSummaryReader summary; + try (final InputStream s = cl.getResourceAsStream("natives.xml")) { + summary = new XMLMethodSummaryReader(s, scope); + } AnalysisOptions options = new AnalysisOptions(scope, null); Map summaries = summary.getSummaries(); for (MethodReference mr : summaries.keySet()) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index 27d293bea..ffd54222d 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -931,8 +931,9 @@ public class SlicerTest { public static void dumpSliceToFile(Collection slice, String fileName) throws FileNotFoundException { File f = new File(fileName); FileOutputStream fo = new FileOutputStream(f); - PrintWriter w = new PrintWriter(fo); - dumpSlice(slice, w); + try (final PrintWriter w = new PrintWriter(fo)) { + dumpSlice(slice, w); + } } public static CGNode findMainMethod(CallGraph cg) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/SimpleThreadEscapeAnalysis.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/SimpleThreadEscapeAnalysis.java index 8451725b0..027b3a8df 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/SimpleThreadEscapeAnalysis.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/SimpleThreadEscapeAnalysis.java @@ -105,7 +105,9 @@ public class SimpleThreadEscapeAnalysis extends AbstractAnalysisEngine { collectJars(files[i], result); } } else if (f.getAbsolutePath().endsWith(".jar")) { - result.add(new JarFile(f, false)); + try (final JarFile jar = new JarFile(f, false)) { + result.add(jar); + } } } diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DalvikCallGraphTestBase.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DalvikCallGraphTestBase.java index 5f8aa02d8..107f9b425 100644 --- a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DalvikCallGraphTestBase.java +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DalvikCallGraphTestBase.java @@ -93,7 +93,10 @@ public class DalvikCallGraphTestBase extends DynamicCallGraphTestBase { public void dynamicCG(File javaJarPath, String mainClass, String... args) throws FileNotFoundException, IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InterruptedException { - File F = TemporaryFile.streamToFile(new File("test_jar.jar"), new FileInputStream(javaJarPath)); + File F; + try (final FileInputStream in = new FileInputStream(javaJarPath)) { + F = TemporaryFile.streamToFile(new File("test_jar.jar"), in); + } F.deleteOnExit(); instrument(F.getAbsolutePath()); run(mainClass.substring(1).replace('/', '.'), "LibraryExclusions.txt", args); diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexFileModule.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexFileModule.java index 598cf81f3..50641bd14 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexFileModule.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexFileModule.java @@ -73,7 +73,9 @@ public class DexFileModule implements Module { public static DexFileModule make(File f) throws IllegalArgumentException, IOException { if (f.getName().endsWith("jar")) { - return new DexFileModule(new JarFile(f)); + try (final JarFile jar = new JarFile(f)) { + return new DexFileModule(jar); + } } else { return new DexFileModule(f); } diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidAnalysisScope.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidAnalysisScope.java index 5859ac0ea..136b7d215 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidAnalysisScope.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidAnalysisScope.java @@ -39,8 +39,9 @@ public class AndroidAnalysisScope { scope = AnalysisScope.createJavaAnalysisScope(); File exclusionsFile = new File(exclusions); - InputStream fs = exclusionsFile.exists()? new FileInputStream(exclusionsFile): FileProvider.class.getClassLoader().getResourceAsStream(exclusionsFile.getName()); - scope.setExclusions(new FileOfClasses(fs)); + try (final InputStream fs = exclusionsFile.exists()? new FileInputStream(exclusionsFile): FileProvider.class.getClassLoader().getResourceAsStream(exclusionsFile.getName())) { + scope.setExclusions(new FileOfClasses(fs)); + } scope.setLoaderImpl(ClassLoaderReference.Primordial, "com.ibm.wala.dalvik.classLoader.WDexClassLoaderImpl"); @@ -50,7 +51,9 @@ public class AndroidAnalysisScope { scope.addToScope(ClassLoaderReference.Primordial, DexFileModule.make(new File(al))); } catch (Exception e) { e.printStackTrace(); - scope.addToScope(ClassLoaderReference.Primordial, new JarFileModule(new JarFile(new File(al)))); + try (final JarFile jar = new JarFile(new File(al))) { + scope.addToScope(ClassLoaderReference.Primordial, new JarFileModule(jar)); + } } } diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidManifestXMLReader.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidManifestXMLReader.java index 176682697..4250584ca 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidManifestXMLReader.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidManifestXMLReader.java @@ -101,8 +101,8 @@ public class AndroidManifestXMLReader { if (xmlFile == null) { throw new IllegalArgumentException("xmlFile may not be null"); } - try { - readXML(new FileInputStream(xmlFile)); + try (final FileInputStream in = new FileInputStream(xmlFile)) { + readXML(in); } catch (Exception e) { e.printStackTrace(); throw new IllegalStateException("Exception was thrown"); diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java index 82896f3e2..c30e4bc4a 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java @@ -37,6 +37,7 @@ */ package com.ibm.wala.cast.java.test; +import java.io.IOException; import java.util.Collection; import java.util.List; @@ -50,8 +51,14 @@ public class JDTJavaIRTests extends JavaIRTests { public static final String PROJECT_ZIP = "test_project.zip"; - public static final ZippedProjectData PROJECT = new ZippedProjectData(Activator.getDefault(), PROJECT_NAME, PROJECT_ZIP); - + public static final ZippedProjectData PROJECT; + static { + try { + PROJECT = new ZippedProjectData(Activator.getDefault(), PROJECT_NAME, PROJECT_ZIP); + } catch (IOException e) { + throw new RuntimeException(e); + } + } private final ZippedProjectData project; public JDTJavaIRTests() { diff --git a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java index 3d2b8739e..8b438ac3f 100644 --- a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java +++ b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java @@ -10,6 +10,8 @@ *******************************************************************************/ package com.ibm.wala.ide.jsdt.tests; +import java.io.IOException; + import com.ibm.wala.ide.tests.util.EclipseTestUtil.ZippedProjectData; public class JSProjectScopeTest extends AbstractJSProjectScopeTest { @@ -18,7 +20,14 @@ public class JSProjectScopeTest extends AbstractJSProjectScopeTest { public static final String PROJECT_ZIP = "test_js_project.zip"; - public static final ZippedProjectData PROJECT = new ZippedProjectData(Activator.getDefault(), PROJECT_NAME, PROJECT_ZIP); + public static final ZippedProjectData PROJECT; + static { + try { + PROJECT = new ZippedProjectData(Activator.getDefault(), PROJECT_NAME, PROJECT_ZIP); + } catch (IOException e) { + throw new RuntimeException(e); + } + } public JSProjectScopeTest() { super(PROJECT); diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java index 33d90b3f1..adbab60fc 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java @@ -41,14 +41,14 @@ public class EclipseTestUtil { public final String projectName; public final String zipFileName; - public ZippedProjectData(Plugin sourcePlugin, String projectName, String zipFileName) { + public ZippedProjectData(Plugin sourcePlugin, String projectName, String zipFileName) throws IOException { this.sourcePlugin = sourcePlugin; this.projectName = projectName; this.zipFileName = zipFileName; open(); } - private void open() { + private void open() throws IOException { importZippedProject(sourcePlugin, projectName, zipFileName, new NullProgressMonitor()); } @@ -57,10 +57,11 @@ public class EclipseTestUtil { } } - public static void importZippedProject(Plugin plugin, String projectName, String zipFileName, IProgressMonitor monitor) { - ZipFile zipFile = getZipFile(plugin, zipFileName); - createOpenProject(projectName); - importZipfile(projectName, zipFile, monitor); + public static void importZippedProject(Plugin plugin, String projectName, String zipFileName, IProgressMonitor monitor) throws IOException { + try (final ZipFile zipFile = getZipFile(plugin, zipFileName)) { + createOpenProject(projectName); + importZipfile(projectName, zipFile, monitor); + } } public static void createOpenProject(String projectName) { diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java index 5fedb3c8c..5e930cc98 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java @@ -60,8 +60,9 @@ abstract public class EclipseProjectAnalysisEngine ext ePath = createProjectPath(project); super.scope = ePath.toAnalysisScope(makeAnalysisScope()); if (getExclusionsFile() != null) { - InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile()); - scope.setExclusions(new FileOfClasses(is)); + try (final InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile())) { + scope.setExclusions(new FileOfClasses(is)); + } } } catch (CoreException e) { assert false : e.getMessage(); diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseFileProvider.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseFileProvider.java index 3fca9dd9c..ab37704a9 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseFileProvider.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseFileProvider.java @@ -75,7 +75,9 @@ public class EclipseFileProvider extends FileProvider { IPath path = new Path(fileName); if (workspaceRoot_getFile.invoke(workspaceRoot, path) != null) { - return new JarFileModule(new JarFile(fileName, false)); + try (final JarFile jar = new JarFile(fileName, false)) { + return new JarFileModule(jar); + } } } catch (Exception e) { } @@ -105,7 +107,10 @@ public class EclipseFileProvider extends FileProvider { */ private JarFileModule getFromPlugin(Plugin p, String fileName) throws IOException { URL url = getFileURLFromPlugin(p, fileName); - return (url == null) ? null : new JarFileModule(new JarFile(filePathFromURL(url))); + if (url == null) return null; + try (final JarFile jar = new JarFile(filePathFromURL(url))) { + return new JarFileModule(jar); + } } /** diff --git a/com.ibm.wala.scandroid/source/org/scandroid/util/AndroidAnalysisContext.java b/com.ibm.wala.scandroid/source/org/scandroid/util/AndroidAnalysisContext.java index 5e713c8da..1f7cfea35 100644 --- a/com.ibm.wala.scandroid/source/org/scandroid/util/AndroidAnalysisContext.java +++ b/com.ibm.wala.scandroid/source/org/scandroid/util/AndroidAnalysisContext.java @@ -312,26 +312,15 @@ public class AndroidAnalysisContext { private static XMLMethodSummaryReader loadMethodSummaries( AnalysisScope scope, InputStream xmlIStream) throws FileNotFoundException { - InputStream s = xmlIStream; - XMLMethodSummaryReader summary = null; - - try { - if (null == s) { - s = AndroidAnalysisContext.class.getClassLoader() - .getResourceAsStream( - pathToSpec + File.separator + methodSpec); - } - summary = new XMLMethodSummaryReader(s, scope); - } finally { - try { - if (null != s) { - s.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } + try (InputStream s = xmlIStream != null ? xmlIStream : + AndroidAnalysisContext.class.getClassLoader() + .getResourceAsStream( + pathToSpec + File.separator + methodSpec)) { + return new XMLMethodSummaryReader(s, scope); + } catch (IOException e) { + e.printStackTrace(); } - return summary; + return null; } /** diff --git a/com.ibm.wala.scandroid/source/org/scandroid/util/CGAnalysisContext.java b/com.ibm.wala.scandroid/source/org/scandroid/util/CGAnalysisContext.java index 2a342ed45..1ea274399 100644 --- a/com.ibm.wala.scandroid/source/org/scandroid/util/CGAnalysisContext.java +++ b/com.ibm.wala.scandroid/source/org/scandroid/util/CGAnalysisContext.java @@ -150,7 +150,9 @@ public class CGAnalysisContext { SSAPropagationCallGraphBuilder cgb; if (null != options.getSummariesURI()) { - extraSummaries.add(new FileInputStream(new File(options.getSummariesURI()))); + try (final FileInputStream in = new FileInputStream(new File(options.getSummariesURI()))) { + extraSummaries.add(in); + } } cgb = AndroidAnalysisContext.makeZeroCFABuilder(analysisOptions, cache, cha, scope, diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/AddBytecodeDebug.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/AddBytecodeDebug.java index a9759acb5..850769cbc 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/AddBytecodeDebug.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/AddBytecodeDebug.java @@ -44,16 +44,16 @@ public class AddBytecodeDebug { for (int i = 0; i < 1; i++) { instrumenter = new OfflineInstrumenter(true); - Writer w = new BufferedWriter(new FileWriter("report", false)); - - args = instrumenter.parseStandardArgs(args); - instrumenter.setPassUnmodifiedClasses(true); - instrumenter.beginTraversal(); - ClassInstrumenter ci; - while ((ci = instrumenter.nextClass()) != null) { - doClass(ci, w); + try (final Writer w = new BufferedWriter(new FileWriter("report", false))) { + args = instrumenter.parseStandardArgs(args); + instrumenter.setPassUnmodifiedClasses(true); + instrumenter.beginTraversal(); + ClassInstrumenter ci; + while ((ci = instrumenter.nextClass()) != null) { + doClass(ci, w); + } + instrumenter.close(); } - instrumenter.close(); } } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Bench.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Bench.java index 9192c83bc..7955c1ff8 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Bench.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Bench.java @@ -62,23 +62,24 @@ public class Bench { public static void main(String[] args) throws Exception { for (int i = 0; i < 1; i++) { - Writer w = new BufferedWriter(new FileWriter("report", false)); + try (final Writer w = new BufferedWriter(new FileWriter("report", false))) { - args = instrumenter.parseStandardArgs(args); - if (args.length > 0) { - if (args[0].equals("-doexit")) { - doExit = true; - } else if (args[0].equals("-doexception")) { - doExit = true; - doException = true; + args = instrumenter.parseStandardArgs(args); + if (args.length > 0) { + if (args[0].equals("-doexit")) { + doExit = true; + } else if (args[0].equals("-doexception")) { + doExit = true; + doException = true; + } + } + instrumenter = new OfflineInstrumenter(!doException); + instrumenter.setPassUnmodifiedClasses(true); + instrumenter.beginTraversal(); + ClassInstrumenter ci; + while ((ci = instrumenter.nextClass()) != null) { + doClass(ci, w); } - } - instrumenter = new OfflineInstrumenter(!doException); - instrumenter.setPassUnmodifiedClasses(true); - instrumenter.beginTraversal(); - ClassInstrumenter ci; - while ((ci = instrumenter.nextClass()) != null) { - doClass(ci, w); } instrumenter.close(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Mangler.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Mangler.java index d62c81557..049482598 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Mangler.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/bench/Mangler.java @@ -59,25 +59,25 @@ public class Mangler { for (int i = 0; i < 1; i++) { instrumenter = new OfflineInstrumenter(true); - Writer w = new BufferedWriter(new FileWriter("report", false)); + try (final Writer w = new BufferedWriter(new FileWriter("report", false))) { - args = instrumenter.parseStandardArgs(args); - int seed; - try { - seed = Integer.parseInt(args[0]); - } catch (NumberFormatException ex) { - System.err.println("Invalid number: " + args[0]); - w.close(); - return; - } + args = instrumenter.parseStandardArgs(args); + int seed; + try { + seed = Integer.parseInt(args[0]); + } catch (NumberFormatException ex) { + System.err.println("Invalid number: " + args[0]); + return; + } - Random r = new Random(seed); - instrumenter.setPassUnmodifiedClasses(true); - instrumenter.beginTraversal(); - instrumenter.setOutputJar(new File("output.jar")); - ClassInstrumenter ci; - while ((ci = instrumenter.nextClass()) != null) { - doClass(ci, w, r); + Random r = new Random(seed); + instrumenter.setPassUnmodifiedClasses(true); + instrumenter.beginTraversal(); + instrumenter.setOutputJar(new File("output.jar")); + ClassInstrumenter ci; + while ((ci = instrumenter.nextClass()) != null) { + doClass(ci, w, r); + } } instrumenter.close(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/OfflineDynamicCallGraph.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/OfflineDynamicCallGraph.java index a656eec08..06e34283b 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/OfflineDynamicCallGraph.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/OfflineDynamicCallGraph.java @@ -73,47 +73,48 @@ public class OfflineDynamicCallGraph { public static void main(String[] args) throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException { OfflineInstrumenter instrumenter; ClassInstrumenter ci; - Writer w = new BufferedWriter(new FileWriter("report", false)); + try (final Writer w = new BufferedWriter(new FileWriter("report", false))) { - for(int i = 0; i < args.length - 1; i++) { + for(int i = 0; i < args.length - 1; i++) { if ("--runtime".equals(args[i])) { - runtime = Class.forName(args[i+1]); + runtime = Class.forName(args[i+1]); } else if ("--exclusions".equals(args[i])) { - filter = new FileOfClasses(new FileInputStream(args[i+1])); + filter = new FileOfClasses(new FileInputStream(args[i+1])); } else if ("--dont-patch-exits".equals(args[i])) { - patchExits = false; + patchExits = false; } else if ("--patch-calls".equals(args[i])) { - patchCalls = true; - } else if ("--rt-jar".equals(args[i])) { - System.err.println("using " + args[i+1] + " as stdlib"); - OfflineInstrumenter libReader = new OfflineInstrumenter(true); - libReader.addInputJar(new File(args[i+1])); - while ((ci = libReader.nextClass()) != null) { - CTUtils.addClassToHierarchy(cha, ci.getReader()); - } + patchCalls = true; + } else if ("--rt-jar".equals(args[i])) { + System.err.println("using " + args[i+1] + " as stdlib"); + OfflineInstrumenter libReader = new OfflineInstrumenter(true); + libReader.addInputJar(new File(args[i+1])); + while ((ci = libReader.nextClass()) != null) { + CTUtils.addClassToHierarchy(cha, ci.getReader()); + } } } - instrumenter = new OfflineInstrumenter(true); - args = instrumenter.parseStandardArgs(args); - - instrumenter.setPassUnmodifiedClasses(true); + instrumenter = new OfflineInstrumenter(true); + args = instrumenter.parseStandardArgs(args); - instrumenter.beginTraversal(); - while ((ci = instrumenter.nextClass()) != null) { - CTUtils.addClassToHierarchy(cha, ci.getReader()); - } + instrumenter.setPassUnmodifiedClasses(true); - instrumenter.setClassHierarchyProvider(cha); - - instrumenter.beginTraversal(); - while ((ci = instrumenter.nextClass()) != null) { - ClassWriter cw = doClass(ci, w); - if (cw != null) { - instrumenter.outputModifiedClass(ci, cw); + instrumenter.beginTraversal(); + while ((ci = instrumenter.nextClass()) != null) { + CTUtils.addClassToHierarchy(cha, ci.getReader()); + } + + instrumenter.setClassHierarchyProvider(cha); + + instrumenter.beginTraversal(); + while ((ci = instrumenter.nextClass()) != null) { + ClassWriter cw = doClass(ci, w); + if (cw != null) { + instrumenter.outputModifiedClass(ci, cw); + } } } - + instrumenter.close(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/Runtime.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/Runtime.java index efb1f5107..52f2bbf9d 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/Runtime.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/cg/Runtime.java @@ -67,8 +67,8 @@ public class Runtime { }; private Runtime(String fileName, String filterFileName, String policyClassName) { - try { - filter = new FileOfClasses(new FileInputStream(filterFileName)); + try (final FileInputStream in = new FileInputStream(filterFileName)) { + filter = new FileOfClasses(in); } catch (Exception e) { filter = null; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java index b83d38356..afcf42703 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java @@ -191,8 +191,8 @@ public class AddSerialVersion { if (args[i] == null) { throw new IllegalArgumentException("args[" + i + "] is null"); } - try { - byte[] data = Util.readFully(new FileInputStream(args[i])); + try (final FileInputStream in = new FileInputStream(args[i])) { + byte[] data = Util.readFully(in); ClassReader r = new ClassReader(data); System.out.println(Util.makeClass(r.getName()) + ": serialVersionUID = " + computeSerialVersionUID(r)); } catch (FileNotFoundException e) { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BatchVerifier.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BatchVerifier.java index c5c130d9b..f33a67111 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BatchVerifier.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BatchVerifier.java @@ -57,18 +57,19 @@ public class BatchVerifier { } } - PrintWriter w = new PrintWriter(new BufferedWriter(new FileWriter("report", false))); + try (final PrintWriter w = new PrintWriter(new BufferedWriter(new FileWriter("report", false)))) { - oi.beginTraversal(); - ClassInstrumenter ci; - while ((ci = oi.nextClass()) != null) { - ClassReader cr = ci.getReader(); - CTUtils.addClassToHierarchy(store, cr); - } + oi.beginTraversal(); + ClassInstrumenter ci; + while ((ci = oi.nextClass()) != null) { + ClassReader cr = ci.getReader(); + CTUtils.addClassToHierarchy(store, cr); + } - oi.beginTraversal(); - while ((ci = oi.nextClass()) != null) { - doClass(ci.getReader(), w); + oi.beginTraversal(); + while ((ci = oi.nextClass()) != null) { + doClass(ci.getReader(), w); + } } oi.close(); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BootstrapDumper.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BootstrapDumper.java index b303e8a93..7153a4ce1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BootstrapDumper.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/BootstrapDumper.java @@ -55,17 +55,17 @@ public class BootstrapDumper { assert f.exists(); urls[i-1] = f.toURI().toURL(); } - URLClassLoader image = URLClassLoader.newInstance(urls, BootstrapDumper.class.getClassLoader().getParent()); - - System.err.println(image); - - ClassInstrumenter ci; - oi.beginTraversal(); - while ((ci = oi.nextClass()) != null) { - try { - p.doClass(image, ci.getReader()); - } finally { - w.flush(); + try (final URLClassLoader image = URLClassLoader.newInstance(urls, BootstrapDumper.class.getClassLoader().getParent())) { + System.err.println(image); + + ClassInstrumenter ci; + oi.beginTraversal(); + while ((ci = oi.nextClass()) != null) { + try { + p.doClass(image, ci.getReader()); + } finally { + w.flush(); + } } } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/MethodTracer.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/MethodTracer.java index fc9a39f55..0c330a0db 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/MethodTracer.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/MethodTracer.java @@ -53,14 +53,15 @@ public class MethodTracer { for (int i = 0; i < 1; i++) { instrumenter = new OfflineInstrumenter(true); - Writer w = new BufferedWriter(new FileWriter("report", false)); + try (final Writer w = new BufferedWriter(new FileWriter("report", false))) { - instrumenter.parseStandardArgs(args); - instrumenter.setPassUnmodifiedClasses(false); - instrumenter.beginTraversal(); - ClassInstrumenter ci; - while ((ci = instrumenter.nextClass()) != null) { - doClass(ci, w); + instrumenter.parseStandardArgs(args); + instrumenter.setPassUnmodifiedClasses(false); + instrumenter.beginTraversal(); + ClassInstrumenter ci; + while ((ci = instrumenter.nextClass()) != null) { + doClass(ci, w); + } } instrumenter.close(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java index 65fd02f50..ef14203ef 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java @@ -127,6 +127,7 @@ public abstract class OfflineInstrumenterBase { } @Override + @SuppressWarnings("resource") public InputStream open() throws IOException { JarFile cachedJar = openCachedJar(file); return cachedJar.getInputStream(cachedJar.getEntry(name)); @@ -150,6 +151,7 @@ public abstract class OfflineInstrumenterBase { /** * Get the underlying ZipEntry corresponding to this resource. */ + @SuppressWarnings("resource") public ZipEntry getEntry() throws IOException { JarFile cachedJar = openCachedJar(file); return cachedJar.getEntry(name); @@ -454,7 +456,9 @@ public abstract class OfflineInstrumenterBase { throw new IllegalStateException("Output file was not set"); } - outputJar = new JarOutputStream(new FileOutputStream(outputFile)); + @SuppressWarnings("resource") + final FileOutputStream out = new FileOutputStream(outputFile); + outputJar = new JarOutputStream(out); } } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/tables/StringTable.java b/com.ibm.wala.util/src/com/ibm/wala/util/tables/StringTable.java index c839e95f6..e39649f93 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/tables/StringTable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/tables/StringTable.java @@ -83,7 +83,9 @@ public class StringTable extends Table implements Cloneable { if (f == null) { throw new IllegalArgumentException("null f"); } - return readFromStream(new FileInputStream(f), comment); + try (final FileInputStream in = new FileInputStream(f)) { + return readFromStream(in, comment); + } } /**