Validate when InputStream.read return value is ignored
- Dominant language
- Java
- Stars
- 7.2k
- Forks
- 820
- Avg merge
- 5h 9m
- Merged PRs (30d)
- 50
Description
### Description of the problem / feature request:
InputStream.read (all three overloads) can be dangerous when the return value is ignored, and difficult to debug failures because it depends on the OS, filesystem, and load.
A common failure case I've encountered is:
```java
byte[] readHeader(InputStream stream) throws IOException {
byte[] header = new byte[HEADER_LENGTH];
stream.read(header); // 🌶🌶 Uh-oh!
return header;
}
```
In a test case this function is likely to work, but in many conditions, and for some inputs, the value is not fully read, or read at all in the case of an empty stream.
Similar cases exist for RandomAccessFile and Reader.
### Feature requests: what underlying problem are you trying to solve with this feature?
This check would make sense in the [ReturnValueIgnored](http://errorprone.info/bugpattern/ReturnValueIgnored) bug pattern.
### Bugs: what's the simplest, easiest way to reproduce this bug? Please provide a minimal example if possible.
I would recommend implementing suggested fixes for the following cases:
```diff
InputStream stream = createStream();
byte[] buffer = new byte[1024];
// InputStream.read(byte[])
-stream.read(buffer);
+ByteStreams.readFully(stream, buffer);
// InputStream.read(byte[], int, int)
-stream.read(buffer, 0, buffer.length);
+ByteStreams.readFully(stream, buffer, 0, buffer.length);
// InputStream.skip(long)
-stream.skip(100);
+ByteStreams.skipFully(stream, 100);
// RandomAccessFile.read(byte[])
RandomAccessFile raf = createRandomAccessFile();
-raf.read(buffer);
+raf.readFully(buffer);
// Reader
Reader reader = createReader();
-reader.skip(100);
+CharStreams.skipFully(reader, 100);
```
I have implemented the described check and suggested fixes, but I'd prefer if this was provided out of the box:
https://github.com/palantir/gradle-baseline/blob/develop/baseline-error-prone/src/main/java/com/palantir/baseline/errorprone/ReadReturnValueIgnored.java
### What version of Error Prone are you using?
v2.3.3, however this has not been implemented on master either.
### Have you found anything relevant by searching the web?
Spotbugs provides a similar check:
https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rr-method-ignores-results-of-inputstream-read-rr-not-checked
Contributor guide
Assessment
This issue has not been assessed yet.