Skip to content

Commit 19c9ea7

Browse files
committed
C++: Implement alias and side effect models for iterators.
1 parent a51fe4a commit 19c9ea7

File tree

4 files changed

+1179
-1243
lines changed

4 files changed

+1179
-1243
lines changed

cpp/ql/lib/semmle/code/cpp/models/implementations/Iterator.qll

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import cpp
99
import semmle.code.cpp.models.interfaces.Taint
1010
import semmle.code.cpp.models.interfaces.DataFlow
1111
import 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

Comments
 (0)