Skip to content

Commit f5e4725

Browse files
committed
C++: Propagate flow from instruction's to non-exact operands for arrays and unions, and accept test changes.
1 parent 2bf8e47 commit f5e4725

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,19 @@ private predicate commonTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode
210210
}
211211

212212
private predicate instructionToOperandTaintStep(Instruction fromInstr, Operand toOperand) {
213+
// Propagate flow from the definition of an operand to the operand, even when the overlap is inexact.
214+
// We only do this in certain cases:
215+
// 1. The instruction's result must not be conflated, and
216+
// 2. The instruction's result type is one the types where we expect element-to-object flow. Currently
217+
// this array types and union types. This matches the other two cases of element-to-object flow in
218+
// `DefaultTaintTracking`.
219+
toOperand.getAnyDef() = fromInstr and
220+
not fromInstr.isResultConflated() and
221+
(
222+
fromInstr.getResultType() instanceof ArrayType or
223+
fromInstr.getResultType() instanceof Union
224+
)
225+
or
213226
exists(ReadSideEffectInstruction readInstr |
214227
fromInstr = readInstr.getArgumentDef() and
215228
toOperand = readInstr.getSideEffectOperand()

cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ edges
44
| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy |
55
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
66
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
7+
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
78
| globalVars.c:8:7:8:10 | copy | globalVars.c:35:11:35:14 | copy |
89
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
910
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
1011
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
1112
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
1213
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
14+
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
1315
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
1416
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
1517
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
@@ -25,9 +27,15 @@ edges
2527
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv |
2628
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | (const char *)... |
2729
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | copy |
30+
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
31+
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
32+
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
2833
| globalVars.c:35:11:35:14 | copy | globalVars.c:15:21:15:23 | val |
2934
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:38:9:38:13 | (const char *)... |
3035
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:38:9:38:13 | copy2 |
36+
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
37+
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
38+
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
3139
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:50:9:50:13 | (const char *)... |
3240
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:50:9:50:13 | copy2 |
3341
nodes

0 commit comments

Comments
 (0)