@@ -9,6 +9,8 @@ import cpp
99import semmle.code.cpp.models.interfaces.Taint
1010import semmle.code.cpp.models.interfaces.DataFlow
1111import semmle.code.cpp.models.interfaces.Iterator
12+ import semmle.code.cpp.models.interfaces.Alias
13+ import semmle.code.cpp.models.interfaces.SideEffect
1214
1315/**
1416 * An instantiation of the `std::iterator_traits` template.
@@ -438,7 +440,9 @@ private class IteratorAssignmentMemberOperatorModel extends IteratorAssignmentMe
438440 * A `begin` or `end` member function, or a related member function, that
439441 * returns an iterator.
440442 */
441- private class BeginOrEndFunction extends MemberFunction , TaintFunction , GetIteratorFunction {
443+ private class BeginOrEndFunction extends MemberFunction , TaintFunction , GetIteratorFunction ,
444+ AliasFunction , SideEffectFunction
445+ {
442446 BeginOrEndFunction ( ) {
443447 this .hasName ( [
444448 "begin" , "cbegin" , "rbegin" , "crbegin" , "end" , "cend" , "rend" , "crend" , "before_begin" ,
@@ -456,6 +460,22 @@ private class BeginOrEndFunction extends MemberFunction, TaintFunction, GetItera
456460 input .isQualifierObject ( ) and
457461 output .isReturnValue ( )
458462 }
463+
464+ override predicate parameterNeverEscapes ( int index ) { index = - 1 }
465+
466+ override predicate parameterEscapesOnlyViaReturn ( int index ) { none ( ) }
467+
468+ override predicate hasOnlySpecificReadSideEffects ( ) { any ( ) }
469+
470+ override predicate hasOnlySpecificWriteSideEffects ( ) { any ( ) }
471+
472+ override predicate hasSpecificWriteSideEffect ( ParameterIndex i , boolean buffer , boolean mustWrite ) {
473+ none ( )
474+ }
475+
476+ override predicate hasSpecificReadSideEffect ( ParameterIndex i , boolean buffer ) {
477+ i = - 1 and buffer = false
478+ }
459479}
460480
461481/**
0 commit comments