Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The char type is the only unsigned primitive type in Java. It is easy to overlook this fact and assume that a signed value can be stored and retrieved successfully. Common effects of the defective code include memory leaks and misrepresented data.

Noncompliant Code Example

Wiki Markup
This noncompliant example is from the {{sun.net.httpserver.ChunkedInputStream}} class. The {{InputStream}} class's {{read()}} method returns a signed byte in the form of a signed integer. In this case, the end of stream is being checked by casting the return value to a {{char}}. This conversion would leave the value of {{c}} as {{0xffff}} instead of -1. The termination test is doomed to fail. \[[Pugh 08|AA. Java References#Pugh 08]\] 

Code Block
bgColor#FFcccc
char c;
while ((c=(char)in.read())!= -1) { ... }

Compliant Solution

Always use a signed type of sufficient size to store signed data. To be compliant, use an integer type to check for EOF while reading in data.

Code Block
bgColor#ccccff
int c;
while ((c=in.read())!= -1) { ... }

Risk Assessment

Trying to store signed data in an unsigned type can lead to misinterpretations about the actual value.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

INT35-J

low

unlikely

low

P3

L3

Automated Detection

TODO

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

References

Wiki Markup
\[[API 06|AA. Java References#API 06]\] Class {{InputStream}}
\[[JLS 05|AA. Java References#JLS 05]\] 4.2 Primitive Types and Values
\[[Pugh 08|AA. Java References#Pugh 08]\] "Waiting for the end"