复合赋值中的隐式缩小转换¶
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
形式为 x += y
或 x *= y
的复合赋值语句,如果 x
的类型比 y
的类型窄,则会执行隐式缩小转换。例如,x += y
等效于 x = (T)(x + y)
,其中 T
是 x
的类型。这可能导致信息丢失和数值错误(例如溢出)。
建议¶
确保复合赋值语句左侧的类型至少与右侧的类型一样宽。
示例¶
如果 x
的类型为 short
,y
的类型为 int
,则表达式 x + y
的类型为 int
。但是,表达式 x += y
等效于 x = (short) (x + y)
。表达式 x + y
被强制转换为赋值左侧的类型:short
,可能导致信息丢失。
为避免隐式缩小 x + y
的类型,请将 x
的类型更改为 int
。然后,x
和 x + y
的类型均为 int
,无需隐式转换。