|
|
|
/*
|
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package codetoanalyze.java.infer;
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
import java.io.FileReader;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.io.PipedReader;
|
|
|
|
import java.io.PipedWriter;
|
|
|
|
import java.io.PushbackReader;
|
|
|
|
import java.io.Reader;
|
|
|
|
|
|
|
|
public class ReaderLeaks {
|
|
|
|
|
|
|
|
private void ignore(Object o) {}
|
|
|
|
|
|
|
|
// Reader tests
|
|
|
|
|
|
|
|
public void readerNotClosedAfterRead() {
|
|
|
|
Reader r;
|
|
|
|
try {
|
|
|
|
r = new FileReader("testing.txt");
|
|
|
|
r.read();
|
|
|
|
r.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* This test seems to be flaky in the CI at the moment.
|
|
|
|
We guess it's because of timeouts in the analysis.
|
|
|
|
public void readerClosedOk() throws IOException {
|
|
|
|
Reader r = null;
|
|
|
|
try {
|
|
|
|
r = new FileReader("testing.txt");
|
|
|
|
boolean ready = r.ready();
|
|
|
|
r.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (r != null) r.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
// BufferedReader tests
|
|
|
|
|
|
|
|
public void bufferedReaderNotClosedAfterRead() {
|
|
|
|
BufferedReader reader;
|
|
|
|
try {
|
|
|
|
reader = new BufferedReader(new FileReader("testing.txt"));
|
|
|
|
ignore(reader.read());
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void bufferedReaderClosed() throws IOException {
|
|
|
|
BufferedReader reader = null;
|
|
|
|
try {
|
|
|
|
reader = new BufferedReader(new FileReader("testing.txt"));
|
|
|
|
ignore(reader.read());
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (reader != null) reader.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void noNeedToCloseBufferReaderWrapperOk(File file) throws IOException {
|
|
|
|
try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file))) {
|
|
|
|
BufferedReader reader = new BufferedReader(inputStreamReader);
|
|
|
|
ignore(reader.readLine());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InputStreamReader tests
|
|
|
|
|
|
|
|
public void inputStreamReaderNotClosedAfterRead() {
|
|
|
|
InputStreamReader reader;
|
|
|
|
try {
|
|
|
|
reader = new InputStreamReader(new FileInputStream("testing.txt"));
|
|
|
|
reader.read();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void inputStreamReaderClosed() throws IOException {
|
|
|
|
InputStreamReader reader = null;
|
|
|
|
try {
|
|
|
|
reader = new InputStreamReader(new FileInputStream("testing.txt"));
|
|
|
|
ignore(reader.read());
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (reader != null) reader.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// FileReader tests
|
|
|
|
|
|
|
|
public void fileReaderNotClosedAfterRead() {
|
|
|
|
FileReader reader;
|
|
|
|
try {
|
|
|
|
reader = new FileReader("testing.txt");
|
|
|
|
reader.read();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void fileReaderClosed() throws IOException {
|
|
|
|
FileReader reader = null;
|
|
|
|
try {
|
|
|
|
reader = new FileReader("testing.txt");
|
|
|
|
reader.read();
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (reader != null) reader.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PushbackReader tests
|
|
|
|
|
|
|
|
public void pushbackReaderNotClosedAfterRead() {
|
|
|
|
PushbackReader reader;
|
|
|
|
try {
|
|
|
|
reader = new PushbackReader(new InputStreamReader(new FileInputStream("testing.txt")));
|
|
|
|
reader.read();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void pushbackReaderClosed() throws IOException {
|
|
|
|
PushbackReader reader = null;
|
|
|
|
try {
|
|
|
|
reader = new PushbackReader(new InputStreamReader(new FileInputStream("testing.txt")));
|
|
|
|
reader.read();
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (reader != null) reader.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PipedReader tests
|
|
|
|
|
|
|
|
public void pipedReaderNotClosedAfterConstructedWithWriter() {
|
|
|
|
PipedReader reader;
|
|
|
|
PipedWriter writer;
|
|
|
|
try {
|
|
|
|
writer = new PipedWriter();
|
|
|
|
reader = new PipedReader(writer);
|
|
|
|
reader.read();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void pipedReaderNotClosedAfterConnect(PipedWriter writer) {
|
|
|
|
PipedReader reader;
|
|
|
|
try {
|
|
|
|
reader = new PipedReader();
|
|
|
|
reader.connect(writer);
|
|
|
|
reader.read();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void pipedReaderNotConnected() {
|
|
|
|
PipedReader reader;
|
|
|
|
try {
|
|
|
|
reader = new PipedReader();
|
|
|
|
reader.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void pipedReaderClosed(PipedWriter writer) throws IOException {
|
|
|
|
PipedReader reader = null;
|
|
|
|
try {
|
|
|
|
reader = new PipedReader();
|
|
|
|
reader.connect(writer);
|
|
|
|
reader.read();
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (reader != null) reader.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void pipedReaderFalsePositive() throws IOException {
|
|
|
|
PipedReader reader;
|
|
|
|
PipedWriter writer = null;
|
|
|
|
try {
|
|
|
|
reader = new PipedReader(writer);
|
|
|
|
reader.read();
|
|
|
|
} catch (IOException e) {
|
|
|
|
} finally {
|
|
|
|
if (writer != null) writer.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|