Skip to content

Commit b9a6558

Browse files
committed
C++: Some constructors should have dataflow instead of taint.
1 parent 031c9b9 commit b9a6558

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

cpp/ql/src/semmle/code/cpp/MemberFunction.qll

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,12 @@ class Constructor extends MemberFunction, TaintFunction {
197197

198198
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
199199
// taint flow from any constructor argument to the returned object
200-
input.isParameter(_) and
201-
output.isReturnValue()
200+
exists(int idx |
201+
input.isParameter(idx) and
202+
output.isReturnValue() and
203+
not this.(CopyConstructor).hasDataFlow(input, output) and // don't duplicate where we have data flow
204+
not this.(MoveConstructor).hasDataFlow(input, output) // don't duplicate where we have data flow
205+
)
202206
}
203207
}
204208

@@ -274,7 +278,7 @@ private predicate hasMoveSignature(MemberFunction f) {
274278
* desired instead, see the member predicate
275279
* `mayNotBeCopyConstructorInInstantiation`.
276280
*/
277-
class CopyConstructor extends Constructor {
281+
class CopyConstructor extends Constructor, DataFlowFunction {
278282
CopyConstructor() {
279283
hasCopySignature(this) and
280284
(
@@ -306,6 +310,12 @@ class CopyConstructor extends Constructor {
306310
getDeclaringType() instanceof TemplateClass and
307311
getNumberOfParameters() > 1
308312
}
313+
314+
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
315+
// data flow from the first constructor argument to the returned object
316+
input.isParameter(0) and
317+
output.isReturnValue()
318+
}
309319
}
310320

311321
/**
@@ -331,7 +341,7 @@ class CopyConstructor extends Constructor {
331341
* desired instead, see the member predicate
332342
* `mayNotBeMoveConstructorInInstantiation`.
333343
*/
334-
class MoveConstructor extends Constructor {
344+
class MoveConstructor extends Constructor, DataFlowFunction {
335345
MoveConstructor() {
336346
hasMoveSignature(this) and
337347
(
@@ -363,6 +373,12 @@ class MoveConstructor extends Constructor {
363373
getDeclaringType() instanceof TemplateClass and
364374
getNumberOfParameters() > 1
365375
}
376+
377+
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
378+
// data flow from the first constructor argument to the returned object
379+
input.isParameter(0) and
380+
output.isReturnValue()
381+
}
366382
}
367383

368384
/**

cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
| copyableclass.cpp:20:22:20:23 | call to MyCopyableClass | copyableclass.cpp:26:8:26:9 | s1 | |
1717
| copyableclass.cpp:21:23:21:24 | call to MyCopyableClass | copyableclass.cpp:27:8:27:9 | s2 | |
1818
| copyableclass.cpp:21:24:21:24 | 1 | copyableclass.cpp:21:23:21:24 | call to MyCopyableClass | TAINT |
19-
| copyableclass.cpp:22:22:22:23 | s1 | copyableclass.cpp:22:22:22:24 | call to MyCopyableClass | TAINT |
19+
| copyableclass.cpp:22:22:22:23 | s1 | copyableclass.cpp:22:22:22:24 | call to MyCopyableClass | |
2020
| copyableclass.cpp:22:22:22:24 | call to MyCopyableClass | copyableclass.cpp:28:8:28:9 | s3 | |
2121
| copyableclass.cpp:23:19:23:20 | call to MyCopyableClass | copyableclass.cpp:24:3:24:4 | s4 | |
2222
| copyableclass.cpp:23:19:23:20 | call to MyCopyableClass | copyableclass.cpp:29:8:29:9 | s4 | |
@@ -27,7 +27,7 @@
2727
| copyableclass.cpp:33:22:33:30 | call to MyCopyableClass | copyableclass.cpp:39:8:39:9 | s1 | |
2828
| copyableclass.cpp:34:23:34:31 | call to MyCopyableClass | copyableclass.cpp:40:8:40:9 | s2 | |
2929
| copyableclass.cpp:34:24:34:29 | call to source | copyableclass.cpp:34:23:34:31 | call to MyCopyableClass | TAINT |
30-
| copyableclass.cpp:35:22:35:23 | s1 | copyableclass.cpp:35:22:35:24 | call to MyCopyableClass | TAINT |
30+
| copyableclass.cpp:35:22:35:23 | s1 | copyableclass.cpp:35:22:35:24 | call to MyCopyableClass | |
3131
| copyableclass.cpp:35:22:35:24 | call to MyCopyableClass | copyableclass.cpp:41:8:41:9 | s3 | |
3232
| copyableclass.cpp:36:19:36:20 | call to MyCopyableClass | copyableclass.cpp:37:3:37:4 | s4 | |
3333
| copyableclass.cpp:36:19:36:20 | call to MyCopyableClass | copyableclass.cpp:42:8:42:9 | s4 | |
@@ -38,8 +38,8 @@
3838
| copyableclass.cpp:46:19:46:20 | call to MyCopyableClass | copyableclass.cpp:50:8:50:9 | s1 | |
3939
| copyableclass.cpp:46:19:46:20 | call to MyCopyableClass | copyableclass.cpp:52:8:52:9 | s1 | |
4040
| copyableclass.cpp:47:23:47:25 | call to MyCopyableClass | copyableclass.cpp:53:8:53:9 | s2 | |
41-
| copyableclass.cpp:47:24:47:25 | s1 | copyableclass.cpp:47:23:47:25 | call to MyCopyableClass | TAINT |
42-
| copyableclass.cpp:48:22:48:23 | s1 | copyableclass.cpp:48:22:48:24 | call to MyCopyableClass | TAINT |
41+
| copyableclass.cpp:47:24:47:25 | s1 | copyableclass.cpp:47:23:47:25 | call to MyCopyableClass | |
42+
| copyableclass.cpp:48:22:48:23 | s1 | copyableclass.cpp:48:22:48:24 | call to MyCopyableClass | |
4343
| copyableclass.cpp:48:22:48:24 | call to MyCopyableClass | copyableclass.cpp:54:8:54:9 | s3 | |
4444
| copyableclass.cpp:49:19:49:20 | call to MyCopyableClass | copyableclass.cpp:50:3:50:4 | s4 | |
4545
| copyableclass.cpp:49:19:49:20 | call to MyCopyableClass | copyableclass.cpp:55:8:55:9 | s4 | |
@@ -231,9 +231,9 @@
231231
| movableclass.cpp:50:18:50:19 | call to MyMovableClass | movableclass.cpp:54:8:54:9 | s2 | |
232232
| movableclass.cpp:51:3:51:4 | ref arg s2 | movableclass.cpp:54:8:54:9 | s2 | |
233233
| movableclass.cpp:51:23:51:28 | call to source | movableclass.cpp:51:8:51:31 | call to MyMovableClass | TAINT |
234-
| movableclass.cpp:58:21:58:32 | call to getUnTainted | movableclass.cpp:58:21:58:35 | call to MyMovableClass | TAINT |
234+
| movableclass.cpp:58:21:58:32 | call to getUnTainted | movableclass.cpp:58:21:58:35 | call to MyMovableClass | |
235235
| movableclass.cpp:58:21:58:35 | call to MyMovableClass | movableclass.cpp:62:8:62:9 | s1 | |
236-
| movableclass.cpp:59:21:59:30 | call to getTainted | movableclass.cpp:59:21:59:33 | call to MyMovableClass | TAINT |
236+
| movableclass.cpp:59:21:59:30 | call to getTainted | movableclass.cpp:59:21:59:33 | call to MyMovableClass | |
237237
| movableclass.cpp:59:21:59:33 | call to MyMovableClass | movableclass.cpp:63:8:63:9 | s2 | |
238238
| movableclass.cpp:60:18:60:19 | call to MyMovableClass | movableclass.cpp:64:8:64:9 | s3 | |
239239
| movableclass.cpp:64:13:64:18 | call to source | movableclass.cpp:64:13:64:20 | call to MyMovableClass | TAINT |

0 commit comments

Comments
 (0)