@@ -159,18 +159,14 @@ private module PartialDefinitions {
159
159
Expr innerDefinedExpr ;
160
160
161
161
IteratorPartialDefinition ( ) {
162
- exists ( Expr convertedInner |
163
- not this instanceof Conversion and
164
- valueToUpdate ( convertedInner , this .getFullyConverted ( ) , node ) and
165
- innerDefinedExpr = convertedInner .getUnconverted ( ) and
166
- (
167
- innerDefinedExpr .( Call ) .getQualifier ( ) = getAnIteratorAccess ( collection )
168
- or
169
- innerDefinedExpr .( Call ) .getQualifier ( ) = collection .getAnAccess ( ) and
170
- collection instanceof IteratorParameter
171
- ) and
172
- innerDefinedExpr .( Call ) .getTarget ( ) instanceof IteratorPointerDereferenceMemberOperator
173
- )
162
+ innerDefinedExpr = getInnerDefinedExpr ( this , node ) and
163
+ (
164
+ innerDefinedExpr .( Call ) .getQualifier ( ) = getAnIteratorAccess ( collection )
165
+ or
166
+ innerDefinedExpr .( Call ) .getQualifier ( ) = collection .getAnAccess ( ) and
167
+ collection instanceof IteratorParameter
168
+ ) and
169
+ innerDefinedExpr .( Call ) .getTarget ( ) instanceof IteratorPointerDereferenceMemberOperator
174
170
or
175
171
// iterators passed by value without a copy constructor
176
172
exists ( Call call |
@@ -208,16 +204,18 @@ private module PartialDefinitions {
208
204
}
209
205
}
210
206
207
+ private Expr getInnerDefinedExpr ( Expr e , ControlFlowNode node ) {
208
+ not e instanceof Conversion and
209
+ exists ( Expr convertedInner |
210
+ valueToUpdate ( convertedInner , e .getFullyConverted ( ) , node ) and
211
+ result = convertedInner .getUnconverted ( )
212
+ )
213
+ }
214
+
211
215
class VariablePartialDefinition extends PartialDefinition {
212
216
Expr innerDefinedExpr ;
213
217
214
- VariablePartialDefinition ( ) {
215
- not this instanceof Conversion and
216
- exists ( Expr convertedInner |
217
- valueToUpdate ( convertedInner , this .getFullyConverted ( ) , node ) and
218
- innerDefinedExpr = convertedInner .getUnconverted ( )
219
- )
220
- }
218
+ VariablePartialDefinition ( ) { innerDefinedExpr = getInnerDefinedExpr ( this , node ) }
221
219
222
220
deprecated override predicate partiallyDefines ( Variable v ) {
223
221
innerDefinedExpr = v .getAnAccess ( )
@@ -249,30 +247,15 @@ private module PartialDefinitions {
249
247
Expr innerDefinedExpr ;
250
248
251
249
SmartPointerPartialDefinition ( ) {
252
- exists ( Expr convertedInner |
253
- not this instanceof Conversion and
254
- valueToUpdate ( convertedInner , this .getFullyConverted ( ) , node ) and
255
- innerDefinedExpr = convertedInner .getUnconverted ( ) and
256
- innerDefinedExpr = getAPointerWrapperAccess ( pointer )
257
- )
250
+ innerDefinedExpr = pragma [ only_bind_out ] ( getInnerDefinedExpr ( this , node ) ) and
251
+ innerDefinedExpr = getAPointerWrapperAccess ( pointer , - 1 )
258
252
or
259
- // pointer wrappers passed by value without a copy constructor
253
+ // Pointer wrappers passed to a function by value.
260
254
exists ( Call call |
261
255
call = node and
262
256
call .getAnArgument ( ) = innerDefinedExpr and
263
257
innerDefinedExpr = this and
264
- this = getAPointerWrapperAccess ( pointer ) and
265
- not call instanceof OverloadedPointerDereferenceExpr
266
- )
267
- or
268
- // pointer wrappers passed by value with a copy constructor
269
- exists ( Call call , ConstructorCall copy |
270
- copy .getTarget ( ) instanceof CopyConstructor and
271
- call = node and
272
- call .getAnArgument ( ) = copy and
273
- copy .getArgument ( 0 ) = getAPointerWrapperAccess ( pointer ) and
274
- innerDefinedExpr = this and
275
- this = copy and
258
+ this = getAPointerWrapperAccess ( pointer , 0 ) and
276
259
not call instanceof OverloadedPointerDereferenceExpr
277
260
)
278
261
}
@@ -893,9 +876,20 @@ module FlowVar_internal {
893
876
)
894
877
}
895
878
896
- Call getAPointerWrapperAccess ( Variable pointer ) {
897
- pointer .getUnspecifiedType ( ) instanceof PointerWrapper and
898
- [ result .getQualifier ( ) , result .getAnArgument ( ) ] = pointer .getAnAccess ( )
879
+ /**
880
+ * Gets either:
881
+ * - A call to an unwrapper function, where an access to `pointer` is the qualifier, or
882
+ * - A call to the `CopyConstructor` that copies the value of an access to `pointer`.
883
+ */
884
+ Call getAPointerWrapperAccess ( Variable pointer , int n ) {
885
+ exists ( PointerWrapper wrapper | wrapper = pointer .getUnspecifiedType ( ) .stripType ( ) |
886
+ n = - 1 and
887
+ result .getQualifier ( ) = pointer .getAnAccess ( ) and
888
+ result .getTarget ( ) = wrapper .getAnUnwrapperFunction ( )
889
+ or
890
+ result .getArgument ( n ) = pointer .getAnAccess ( ) and
891
+ result .getTarget ( ) instanceof CopyConstructor
892
+ )
899
893
}
900
894
901
895
class IteratorParameter extends Parameter {
0 commit comments