@@ -9,6 +9,8 @@ import cpp
9
9
import semmle.code.cpp.models.interfaces.Taint
10
10
import semmle.code.cpp.models.interfaces.DataFlow
11
11
import semmle.code.cpp.models.interfaces.Iterator
12
+ import semmle.code.cpp.models.interfaces.Alias
13
+ import semmle.code.cpp.models.interfaces.SideEffect
12
14
13
15
/**
14
16
* An instantiation of the `std::iterator_traits` template.
@@ -438,7 +440,9 @@ private class IteratorAssignmentMemberOperatorModel extends IteratorAssignmentMe
438
440
* A `begin` or `end` member function, or a related member function, that
439
441
* returns an iterator.
440
442
*/
441
- private class BeginOrEndFunction extends MemberFunction , TaintFunction , GetIteratorFunction {
443
+ private class BeginOrEndFunction extends MemberFunction , TaintFunction , GetIteratorFunction ,
444
+ AliasFunction , SideEffectFunction
445
+ {
442
446
BeginOrEndFunction ( ) {
443
447
this .hasName ( [
444
448
"begin" , "cbegin" , "rbegin" , "crbegin" , "end" , "cend" , "rend" , "crend" , "before_begin" ,
@@ -456,6 +460,22 @@ private class BeginOrEndFunction extends MemberFunction, TaintFunction, GetItera
456
460
input .isQualifierObject ( ) and
457
461
output .isReturnValue ( )
458
462
}
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
+ }
459
479
}
460
480
461
481
/**
0 commit comments