Java: TypeAccess matches implicit access
- 主要语言
- CodeQL
- 星标
- 10.1k
- 派生
- 2.1k
- 平均合并
- 2 天 15 小时
- 30 天内合并 PR
- 141
描述
**Description of the issue**
It appears `TypeAccess` matches implicit (?) access of types, and that even when it has to hold `fromSource()`. This is not documented, and even QL's built-in query [`java/unused-import`](https://github.com/github/codeql/blob/master/java/ql/src/Violations%20of%20Best%20Practice/legacy/UnnecessaryImport.ql) appears to not consider this.
This behavior renders `TypeAccess` useless for certain queries.
Try the query below on the demo projects on https://lgtm.com/query:
```ql
import java
import semmle.code.java.Conversions
from TypeAccess typeAccess, RefType type, Location location, int expectedLength, int startColumn, int actualLength
where
type = typeAccess.getType()
and location = typeAccess.getLocation()
and type = type.getErasure()
and not type instanceof GenericType
and not type.hasAnnotation()
and not typeAccess.hasQualifier()
and expectedLength = type.getName().length()
// Ignore type access spanning multiple lines
and location.getNumberOfLines() = 1
and startColumn = location.getStartColumn()
// + 1 because both are inclusive
and actualLength = location.getEndColumn() - startColumn + 1
and expectedLength != actualLength
select typeAccess, expectedLength, startColumn, actualLength
```
While it does match some actual explicit type access (where the type is fully qualified) it also matches enum constant declarations, complete lambda bodies and probably other non-explicit access.
Possibly related to #3644.
贡献指南
评估
这个 Issue 还没有评估数据。