Skip to content

Commit a74c4e5

Browse files
committed
Rust: Distinguish &mut T from &T in type inference
1 parent 68d41b8 commit a74c4e5

File tree

34 files changed

+487
-632
lines changed

34 files changed

+487
-632
lines changed

‎rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ module Impl{
3030
op="!"andpath="core::ops::bit::Not"andmethod="not"andborrows=0
3131
or
3232
// Dereference
33+
// todo: handle `core::ops::deref::DerefMut`
3334
op="*"andpath="core::ops::deref::Deref"andmethod="deref"andborrows=1
3435
)
3536
or

‎rust/ql/lib/codeql/rust/frameworks/stdlib/Builtins.qll‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,20 @@ class ArrayType extends BuiltinType{
162162
overridestringgetDisplayName(){result="[;]"}
163163
}
164164

165-
/** The builtin reference type `&T`. */
166-
classRefTypeextendsBuiltinType{
167-
RefType(){this.getName()="Ref"}
165+
/** A builtin reference type `&T` or `&mut T`. */
166+
abstractprivateclassRefTypeImplextendsBuiltinType{}
167+
168+
finalclassRefType=RefTypeImpl;
169+
170+
/** The builtin shared reference type `&T`. */
171+
classRefSharedTypeextendsRefTypeImpl{
172+
RefSharedType(){this.getName()="Ref"}
168173

169174
overridestringgetDisplayName(){result="&"}
170175
}
171176

172-
/** The builtin reference type `&mut T`. */
173-
classRefMutTypeextendsBuiltinType{
177+
/** The builtin mutable reference type `&mut T`. */
178+
classRefMutTypeextendsRefTypeImpl{
174179
RefMutType(){this.getName()="RefMut"}
175180

176181
overridestringgetDisplayName(){result="&mut"}

‎rust/ql/lib/codeql/rust/internal/PathResolution.qll‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,12 @@ private TypeItemNode resolveBuiltin(TypeRepr tr){
771771
trinstanceofArrayTypeReprand
772772
resultinstanceof Builtins::ArrayType
773773
or
774-
trinstanceofRefTypeReprand
775-
resultinstanceof Builtins::RefType
774+
tr=
775+
any(RefTypeReprrtr|
776+
ifrtr.isMut()
777+
thenresultinstanceof Builtins::RefMutType
778+
elseresultinstanceof Builtins::RefSharedType
779+
)
776780
or
777781
tr.(PtrTypeRepr).isConst()and
778782
resultinstanceof Builtins::PtrConstType

‎rust/ql/lib/codeql/rust/internal/Type.qll‎

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,21 +224,33 @@ TypeParamTypeParameter getArrayTypeParameter(){
224224
result=any(ArrayTypet).getPositionalTypeParameter(0)
225225
}
226226

227-
/**
228-
* A reference type.
229-
*
230-
* Reference types like `& i64` are modeled as normal generic types
231-
* with a single type argument.
232-
*/
233-
classRefTypeextendsStructType{
234-
RefType(){this.getStruct()instanceof Builtins::RefType}
227+
abstractclassRefTypeextendsStructType{}
228+
229+
pragma[nomagic]
230+
TypeParamTypeParametergetRefTypeParameter(){
231+
result=any(RefTypet).getPositionalTypeParameter(0)
232+
}
233+
234+
classRefMutTypeextendsRefType{
235+
RefMutType(){this.getStruct()instanceof Builtins::RefMutType}
236+
237+
overridestringtoString(){result="&mut"}
238+
}
239+
240+
pragma[nomagic]
241+
TypeParamTypeParametergetRefMutTypeParameter(){
242+
result=any(RefMutTypet).getPositionalTypeParameter(0)
243+
}
244+
245+
classRefSharedTypeextendsRefType{
246+
RefSharedType(){this.getStruct()instanceof Builtins::RefSharedType}
235247

236248
overridestringtoString(){result="&"}
237249
}
238250

239251
pragma[nomagic]
240-
TypeParamTypeParametergetRefTypeParameter(){
241-
result=any(RefTypet).getPositionalTypeParameter(0)
252+
TypeParamTypeParametergetRefSharedTypeParameter(){
253+
result=any(RefSharedTypet).getPositionalTypeParameter(0)
242254
}
243255

244256
/**

0 commit comments

Comments
(0)