@@ -159,18 +159,14 @@ private module PartialDefinitions {
159159 Expr innerDefinedExpr ;
160160
161161 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
174170 or
175171 // iterators passed by value without a copy constructor
176172 exists ( Call call |
@@ -208,16 +204,18 @@ private module PartialDefinitions {
208204 }
209205 }
210206
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+
211215 class VariablePartialDefinition extends PartialDefinition {
212216 Expr innerDefinedExpr ;
213217
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 ) }
221219
222220 deprecated override predicate partiallyDefines ( Variable v ) {
223221 innerDefinedExpr = v .getAnAccess ( )
@@ -249,30 +247,15 @@ private module PartialDefinitions {
249247 Expr innerDefinedExpr ;
250248
251249 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 )
258252 or
259- // pointer wrappers passed by value without a copy constructor
253+ // Pointer wrappers passed to a function by value.
260254 exists ( Call call |
261255 call = node and
262256 call .getAnArgument ( ) = innerDefinedExpr and
263257 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
276259 not call instanceof OverloadedPointerDereferenceExpr
277260 )
278261 }
@@ -893,9 +876,20 @@ module FlowVar_internal {
893876 )
894877 }
895878
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+ )
899893 }
900894
901895 class IteratorParameter extends Parameter {
0 commit comments