Skip to content

Java: TypeAccess matches implicit access #3648

Open
@Marcono1234

Description

@Marcono1234

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 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:

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    JavaquestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions