Skip to content

Commit 6965a5c

Browse files
committed
unified: Associate a type with a variable
Previously type inference assumed that UnqualifiedMemberAccess could only be qualified by a receiver parameter, which bypasses the abstraction set up in prior phases.
1 parent f53925f commit 6965a5c

2 files changed

Lines changed: 16 additions & 10 deletions

File tree

‎unified/ql/lib/codeql/unified/internal/mad/LegacyMaD.qll‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,7 @@ private predicate classMatchesType(ClassLikeDeclaration cls, string type, boolea
142142
* type `cls`.
143143
*/
144144
pragma[nomagic]
145-
private predicate propertyAccessSelector(
146-
MemberAccess access, ClassLikeDeclaration cls, string name
147-
) {
145+
private predicate propertyAccessSelector(MemberAccess access, ClassLikeDeclaration cls, string name) {
148146
name = access.getMemberName() and
149147
name = any(Selector s).getPropertyName() and
150148
not access = any(CallExpr call).getCallee() and

‎unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll‎

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -331,14 +331,19 @@ module Input3 implements InputSig3 {
331331
}
332332
}
333333

334-
private Type getImplicitReceiverType(UnqualifiedMemberAccess uma, TypePath path) {
335-
exists(Parameter p, Unified::Callable c |
336-
p.getParameterEx().isImplicitReceiverParameter(c) and
337-
c = uma.getImplicitQualifierVariable().getDeclaringCallable() and
338-
result = p.getType().getTypeAt(path)
334+
additional Type inferTypeFromVariable(LocalVariable v, TypePath path) {
335+
result = inferType(v.getABinding(), path)
336+
or
337+
exists(Parameter param |
338+
implicitParameterDecl(param, v) and
339+
result = param.getType().getTypeAt(path)
339340
)
340341
}
341342

343+
private Type getImplicitReceiverType(UnqualifiedMemberAccess uma, TypePath path) {
344+
result = inferTypeFromVariable(uma.getImplicitQualifierVariable(), path)
345+
}
346+
342347
private class UnqualifiedMemberAccessFieldAccess extends FieldAccess, UnqualifiedMemberAccess {
343348
override Expr getReceiver() { none() }
344349

@@ -862,11 +867,14 @@ predicate inferTypeUnique = M3::inferTypeUnique/2;
862867

863868
predicate inferTypeCertain = M3::inferTypeCertain/2;
864869

870+
Type inferVariableType(LocalVariable variable) {
871+
result = Input3::inferTypeFromVariable(variable, _)
872+
}
873+
865874
Type inferBaseType(MemberAccess access) {
866875
result = inferType(access.(MemberAccessExpr).getBase())
867876
or
868-
result.asClass().getAMemberIncludingExtensions() =
869-
access.(UnqualifiedMemberAccess).getImplicitQualifierVariable().getDeclaringCallable()
877+
result = inferVariableType(access.(UnqualifiedMemberAccess).getImplicitQualifierVariable())
870878
}
871879

872880
module Consistency = M3::Consistency;

0 commit comments

Comments
 (0)