Implicit narrowing conversion in compound assignment¶
ID: java/implicit-cast-in-compound-assignment
Kind: problem
Security severity: 8.1
Severity: warning
Precision: very-high
Tags:
   - reliability
   - security
   - external/cwe/cwe-190
   - external/cwe/cwe-192
   - external/cwe/cwe-197
   - external/cwe/cwe-681
Query suites:
   - java-code-scanning.qls
   - java-security-extended.qls
   - java-security-and-quality.qls
Click to see the query in the CodeQL repository
Compound assignment statements of the form x += y or x *= y perform an implicit narrowing conversion if the type of x is narrower than the type of y. For example, x += y is equivalent to x = (T)(x + y), where T is the type of x. This can result in information loss and numeric errors such as overflows.
Recommendation¶
Ensure that the type of the left-hand side of the compound assignment statement is at least as wide as the type of the right-hand side.
Example¶
If x is of type short and y is of type int, the expression x + y is of type int. However, the expression x += y is equivalent to x = (short) (x + y). The expression x + y is cast to the type of the left-hand side of the assignment: short, possibly leading to information loss.
To avoid implicitly narrowing the type of x + y, change the type of x to int. Then the types of x and x + y are both int and there is no need for an implicit cast.
References¶
- J. Bloch and N. Gafter, Java Puzzlers: Traps, Pitfalls, and Corner Cases, Puzzle 9. Addison-Wesley, 2005. 
- Java Language Specification: Compound Assignment Operators, Narrowing Primitive Conversion. 
- SEI CERT Oracle Coding Standard for Java: NUM00-J. Detect or prevent integer overflow. 
- Common Weakness Enumeration: CWE-190. 
- Common Weakness Enumeration: CWE-192. 
- Common Weakness Enumeration: CWE-197. 
- Common Weakness Enumeration: CWE-681. 



