Skip to content

Commit 3804c1f

Browse files
author
Robert Marsh
committed
C++: model returns of strstr and strpbrk
1 parent 41e4d92 commit 3804c1f

File tree

1 file changed

+50
-3
lines changed
  • cpp/ql/src/semmle/code/cpp/models/implementations

1 file changed

+50
-3
lines changed

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

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class PureStrFunction extends AliasFunction, ArrayFunction, TaintFunction, Side
2323
or name = "strnlen"
2424
or name = "strrchr"
2525
or name = "strspn"
26-
or name = "strstr"
2726
or name = "strtod"
2827
or name = "strtof"
2928
or name = "strtol"
@@ -38,6 +37,54 @@ class PureStrFunction extends AliasFunction, ArrayFunction, TaintFunction, Side
3837
getParameter(bufParam).getUnspecifiedType() instanceof PointerType
3938
}
4039

40+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
41+
exists (ParameterIndex i |
42+
input.isInParameter(i) or
43+
(
44+
input.isInParameterPointer(i) and
45+
getParameter(i).getUnspecifiedType() instanceof PointerType
46+
)
47+
) and
48+
(
49+
output.isOutReturnValue()
50+
)
51+
}
52+
53+
override predicate parameterNeverEscapes(int i) {
54+
getParameter(i).getUnspecifiedType() instanceof PointerType
55+
}
56+
57+
override predicate parameterEscapesOnlyViaReturn(int i) {
58+
none()
59+
}
60+
61+
override predicate parameterIsAlwaysReturned(int i) {
62+
none()
63+
}
64+
65+
override predicate neverReadsMemory() {
66+
none()
67+
}
68+
69+
override predicate neverWritesMemory() {
70+
any()
71+
}
72+
}
73+
class PureReturningStrFunction extends AliasFunction, ArrayFunction, TaintFunction, SideEffectFunction {
74+
PureReturningStrFunction() {
75+
exists(string name |
76+
hasName(name) and
77+
(
78+
name = "strstr" or
79+
name = "strpbrk"
80+
)
81+
)
82+
}
83+
84+
override predicate hasArrayInput(int bufParam) {
85+
getParameter(bufParam).getUnspecifiedType() instanceof PointerType
86+
}
87+
4188
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
4289
exists (ParameterIndex i |
4390
input.isInParameter(i) or
@@ -56,11 +103,11 @@ class PureStrFunction extends AliasFunction, ArrayFunction, TaintFunction, Side
56103
}
57104

58105
override predicate parameterNeverEscapes(int i) {
59-
getParameter(i).getUnspecifiedType() instanceof PointerType
106+
i = 1
60107
}
61108

62109
override predicate parameterEscapesOnlyViaReturn(int i) {
63-
none()
110+
i = 0
64111
}
65112

66113
override predicate parameterIsAlwaysReturned(int i) {

0 commit comments

Comments
 (0)