Summary
The rule java/field-masks-super-field is producing a false positive on a Kotlin sealed class that uses open val constructor parameters. No actual field shadowing exists in the source code.
CodeQL Version
GitHub Advanced Security (cloud) - latest on github.dev
Language
Kotlin (analysed via Java extractor)
Minimal Reproduction
sealed class ImageType(open val width: Int, open val height: Int) {
object Portrait : ImageType(78, 98)
object Square : ImageType(78, 78)
object PortraitLarge : ImageType(163, 205)
}
What CodeQL Reports
"This field shadows another field called width/height in a superclass."
Rule ID: java/field-masks-super-field
Why This Is a False Positive
- No subclass redeclares
width or height in its body
- Every
object subclass simply passes values via the constructor to the parent
- There is no Java-style field shadowing at the source level
- The alert appears to be triggered by synthetic bridge method scaffolding
that Kotlin generates for open val properties, which the Java extractor
misidentifies as a field declaration in the subclass
Related
This appears to be in the same category as PR #10859 which excluded Kotlin Live Literals from this same rule:
#10859
That PR acknowledged that Kotlin-generated bytecode patterns can trigger false positives in java/field-masks-super-field. The sealed class + object + open val pattern appears to be another such case.
Workaround
Removing open from the constructor parameters eliminates the alert and is safe when no subclass actually overrides the properties. However
this forces unnecessary code changes to work around a false positive.
Expected Behaviour
The rule should not fire when no subclass explicitly redeclares the field in its body - consistent with how PR #10859 handled Live Literals.
Summary
The rule
java/field-masks-super-fieldis producing a false positive on a Kotlinsealed classthat usesopen valconstructor parameters. No actual field shadowing exists in the source code.CodeQL Version
GitHub Advanced Security (cloud) - latest on github.dev
Language
Kotlin (analysed via Java extractor)
Minimal Reproduction
What CodeQL Reports
Rule ID:
java/field-masks-super-fieldWhy This Is a False Positive
widthorheightin its bodyobjectsubclass simply passes values via the constructor to the parentthat Kotlin generates for
open valproperties, which the Java extractormisidentifies as a field declaration in the subclass
Related
This appears to be in the same category as PR #10859 which excluded Kotlin Live Literals from this same rule:
#10859
That PR acknowledged that Kotlin-generated bytecode patterns can trigger false positives in
java/field-masks-super-field. Thesealed class+object+open valpattern appears to be another such case.Workaround
Removing
openfrom the constructor parameters eliminates the alert and is safe when no subclass actually overrides the properties. Howeverthis forces unnecessary code changes to work around a false positive.
Expected Behaviour
The rule should not fire when no subclass explicitly redeclares the field in its body - consistent with how PR #10859 handled Live Literals.