...
This compliant solution requires that the values read are 32-bit unsigned integers. It reads an unsigned integer value using the readInt() method. The readInt() method assumes signed values and returns a signed int; the return value is converted to a long with sign extension. The code uses an & operation to mask off the upper 32 bits of the long; , producing a value in the range of a 32-bit unsigned integer, as intended. The mask size should be chosen to match the size of the unsigned integer values being read.
| Code Block | ||
|---|---|---|
| ||
public static long getInteger(DataInputStream is) throws IOException {
return is.readInt() & 0xFFFFFFFFL; // maskMask with 32 one-bits
}
|
As a general principle, you should always be aware of the signedness of the data you are reading.
...
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
NUM03-J | lowLow | unlikelyUnlikely | mediumMedium | P2 | L3 |
Automated Detection
Automated detection is infeasible in the general case.
Bibliography
[API 2006] | Class |
Chapter 2, "Primitive Data Types, Cross-Platform Issues, Unsigned Integers" | |
Section 2.4.5, "Accessing Unsigned Data" | |
| [Seacord 2015] | NUM03-J. Use integer types that can fully represent the possible range of unsigned data LiveLesson |
...