Skip to content

Commit 6552499

Browse files
author
Robert Marsh
committed
C++: add model for iter-returning functions
1 parent 4b6ecfb commit 6552499

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -801,9 +801,25 @@ module FlowVar_internal {
801801
}
802802

803803
Expr getAnIteratorAccess(Variable collection) {
804-
exists(Call c, SsaDefinition def, Variable iterator |
805-
c.getQualifier() = collection.getAnAccess() and
806-
c.getTarget() instanceof BeginOrEndFunction and
804+
exists(
805+
Call c, SsaDefinition def, Variable iterator, FunctionInput input, FunctionOutput output
806+
|
807+
c.getTarget().(GetIteratorFunction).getsIterator(input, output) and
808+
(
809+
(
810+
input.isQualifierObject() or
811+
input.isQualifierAddress()
812+
) and
813+
c.getQualifier() = collection.getAnAccess()
814+
or
815+
exists(int index |
816+
input.isParameter(index) or
817+
input.isParameterDeref(index)
818+
|
819+
c.getArgument(index) = collection.getAnAccess()
820+
)
821+
) and
822+
output.isReturnValue() and
807823
def.getAnUltimateDefiningValue(iterator) = c and
808824
result = def.getAUse(iterator)
809825
)

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ class IteratorArrayMemberOperator extends MemberFunction, TaintFunction, Iterato
278278
* A `begin` or `end` member function, or a related member function, that
279279
* returns an iterator.
280280
*/
281-
class BeginOrEndFunction extends MemberFunction, TaintFunction {
281+
class BeginOrEndFunction extends MemberFunction, TaintFunction, GetIteratorFunction {
282282
BeginOrEndFunction() {
283283
this
284284
.hasName(["begin", "cbegin", "rbegin", "crbegin", "end", "cend", "rend", "crend",
@@ -290,4 +290,21 @@ class BeginOrEndFunction extends MemberFunction, TaintFunction {
290290
input.isQualifierObject() and
291291
output.isReturnValue()
292292
}
293+
294+
override predicate getsIterator(FunctionInput input, FunctionOutput output) {
295+
input.isQualifierObject() and
296+
output.isReturnValue()
297+
}
298+
}
299+
300+
class InserterIteratorFunction extends GetIteratorFunction {
301+
InserterIteratorFunction() {
302+
this.hasName(["front_inserter", "inserter", "back_inserter"]) and
303+
this.getNamespace().hasName("std")
304+
}
305+
306+
override predicate getsIterator(FunctionInput input, FunctionOutput output) {
307+
input.isParameterDeref(0) and
308+
output.isReturnValue()
309+
}
293310
}

cpp/ql/src/semmle/code/cpp/models/interfaces/Iterator.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ import semmle.code.cpp.models.Models
1515
* can be used to write to the iterator's underlying collection.
1616
*/
1717
abstract class IteratorReferenceFunction extends Function { }
18+
19+
abstract class GetIteratorFunction extends Function {
20+
abstract predicate getsIterator(FunctionInput input, FunctionOutput output);
21+
}

0 commit comments

Comments
 (0)