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.
This commit is contained in:
Ben Liblit 2017-03-12 00:44:55 -06:00
parent 7a3a23b2b4
commit b1678882b3
28 changed files with 213 additions and 174 deletions

View File

@ -111,8 +111,9 @@ public abstract class JavaSourceAnalysisEngine<I extends InstanceKey> 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) {

View File

@ -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<MappedSourceModule> 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();
}

View File

@ -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();
}

View File

@ -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<MethodReference, MethodSummary> summaries = summary.getSummaries();
for (MethodReference mr : summaries.keySet()) {

View File

@ -931,8 +931,9 @@ public class SlicerTest {
public static void dumpSliceToFile(Collection<Statement> 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) {

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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));
}
}
}

View File

@ -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");

View File

@ -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() {

View File

@ -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);

View File

@ -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) {

View File

@ -60,8 +60,9 @@ abstract public class EclipseProjectAnalysisEngine<P, I extends InstanceKey> 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();

View File

@ -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);
}
}
/**

View File

@ -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;
}
/**

View File

@ -150,7 +150,9 @@ public class CGAnalysisContext<E extends ISSABasicBlock> {
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,

View File

@ -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();
}
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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) {

View File

@ -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();

View File

@ -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();
}
}
}

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -83,7 +83,9 @@ public class StringTable extends Table<String> 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);
}
}
/**