mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
C++: IR data flow through global variables
This commit is contained in:
@@ -244,7 +244,25 @@ OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) {
|
|||||||
* calling context. For example, this would happen with flow through a
|
* calling context. For example, this would happen with flow through a
|
||||||
* global or static variable.
|
* global or static variable.
|
||||||
*/
|
*/
|
||||||
predicate jumpStep(Node n1, Node n2) { none() }
|
predicate jumpStep(Node n1, Node n2) {
|
||||||
|
exists(GlobalOrNamespaceVariable v |
|
||||||
|
v =
|
||||||
|
n1.asInstruction()
|
||||||
|
.(StoreInstruction)
|
||||||
|
.getResultAddress()
|
||||||
|
.(VariableAddressInstruction)
|
||||||
|
.getAstVariable() and
|
||||||
|
v = n2.asVariable()
|
||||||
|
or
|
||||||
|
v =
|
||||||
|
n2.asInstruction()
|
||||||
|
.(LoadInstruction)
|
||||||
|
.getSourceAddress()
|
||||||
|
.(VariableAddressInstruction)
|
||||||
|
.getAstVariable() and
|
||||||
|
v = n1.asVariable()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds if data can flow from `node1` to `node2` via an assignment to `f`.
|
* Holds if data can flow from `node1` to `node2` via an assignment to `f`.
|
||||||
|
|||||||
@@ -334,19 +334,19 @@ namespace FlowThroughGlobals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int f() {
|
int f() {
|
||||||
sink(globalVar); // tainted or clean? Not sure.
|
sink(globalVar); // $ ir=333:17 ir=347:17 // tainted or clean? Not sure.
|
||||||
taintGlobal();
|
taintGlobal();
|
||||||
sink(globalVar); // $ MISSING: ast,ir
|
sink(globalVar); // $ ir=333:17 ir=347:17 MISSING: ast
|
||||||
}
|
}
|
||||||
|
|
||||||
int calledAfterTaint() {
|
int calledAfterTaint() {
|
||||||
sink(globalVar); // $ MISSING: ast,ir
|
sink(globalVar); // $ ir=333:17 ir=347:17 MISSING: ast
|
||||||
}
|
}
|
||||||
|
|
||||||
int taintAndCall() {
|
int taintAndCall() {
|
||||||
globalVar = source();
|
globalVar = source();
|
||||||
calledAfterTaint();
|
calledAfterTaint();
|
||||||
sink(globalVar); // $ ast,ir
|
sink(globalVar); // $ ast ir=333:17 ir=347:17
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,9 +52,9 @@ void do_sink()
|
|||||||
sink(global4); // $ MISSING: ast,ir
|
sink(global4); // $ MISSING: ast,ir
|
||||||
sink(global5);
|
sink(global5);
|
||||||
sink(global6);
|
sink(global6);
|
||||||
sink(global7); // $ MISSING: ast,ir
|
sink(global7); // $ ir MISSING: ast
|
||||||
sink(global8); // $ MISSING: ast,ir
|
sink(global8); // $ ir MISSING: ast
|
||||||
sink(global9); // $ MISSING: ast,ir
|
sink(global9); // $ ir MISSING: ast
|
||||||
sink(global10);
|
sink(global10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,134 @@
|
|||||||
edges
|
edges
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:33:15:33:18 | copy |
|
||||||
|
| globalVars.c:8:7:8:10 | copy | globalVars.c:35:11:35:14 | copy |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:44:15:44:19 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:11:22:11:25 | *argv | globalVars.c:12:2:12:15 | Store |
|
||||||
|
| globalVars.c:11:22:11:25 | argv | globalVars.c:12:2:12:15 | Store |
|
||||||
|
| globalVars.c:12:2:12:15 | Store | globalVars.c:8:7:8:10 | copy |
|
||||||
|
| globalVars.c:15:21:15:23 | val | globalVars.c:16:2:16:12 | Store |
|
||||||
|
| globalVars.c:16:2:16:12 | Store | globalVars.c:9:7:9:11 | copy2 |
|
||||||
|
| globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | ReturnIndirection |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | globalVars.c:24:11:24:14 | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | globalVars.c:24:11:24:14 | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | globalVars.c:24:11:24:14 | argv indirection |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | globalVars.c:24:11:24:14 | argv indirection |
|
||||||
|
| globalVars.c:24:11:24:14 | argv indirection | globalVars.c:11:22:11:25 | *argv |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | (const char *)... |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | copy |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:35:11:35:14 | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy indirection | globalVars.c:19:25:19:27 | *str |
|
||||||
|
| globalVars.c:30:15:30:18 | copy indirection | globalVars.c:30:15:30:18 | printWrapper output argument |
|
||||||
|
| globalVars.c:30:15:30:18 | printWrapper output argument | globalVars.c:35:11:35:14 | copy |
|
||||||
|
| globalVars.c:33:15:33:18 | copy | globalVars.c:35:11:35:14 | copy |
|
||||||
|
| globalVars.c:35:11:35:14 | copy | globalVars.c:15:21:15:23 | val |
|
||||||
|
| globalVars.c:35:11:35:14 | copy | globalVars.c:35:11:35:14 | copy |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:38:9:38:13 | (const char *)... |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:38:9:38:13 | copy2 |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:38:9:38:13 | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | (const char *)... |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 indirection | globalVars.c:19:25:19:27 | *str |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 indirection | globalVars.c:41:15:41:19 | printWrapper output argument |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | (const char *)... |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | copy2 indirection |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | (const char *)... |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 indirection |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:50:9:50:13 | (const char *)... |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:50:9:50:13 | copy2 |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:50:9:50:13 | copy2 indirection |
|
||||||
subpaths
|
subpaths
|
||||||
|
| globalVars.c:30:15:30:18 | copy indirection | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | ReturnIndirection | globalVars.c:30:15:30:18 | printWrapper output argument |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 indirection | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | ReturnIndirection | globalVars.c:41:15:41:19 | printWrapper output argument |
|
||||||
nodes
|
nodes
|
||||||
|
| globalVars.c:8:7:8:10 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:9:7:9:11 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:11:22:11:25 | *argv | semmle.label | *argv |
|
||||||
|
| globalVars.c:11:22:11:25 | argv | semmle.label | argv |
|
||||||
|
| globalVars.c:12:2:12:15 | Store | semmle.label | Store |
|
||||||
|
| globalVars.c:15:21:15:23 | val | semmle.label | val |
|
||||||
|
| globalVars.c:16:2:16:12 | Store | semmle.label | Store |
|
||||||
|
| globalVars.c:19:25:19:27 | *str | semmle.label | *str |
|
||||||
|
| globalVars.c:19:25:19:27 | ReturnIndirection | semmle.label | ReturnIndirection |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | semmle.label | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | semmle.label | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv | semmle.label | argv |
|
||||||
|
| globalVars.c:24:11:24:14 | argv indirection | semmle.label | argv indirection |
|
||||||
|
| globalVars.c:27:9:27:12 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:27:9:27:12 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:27:9:27:12 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:27:9:27:12 | copy indirection | semmle.label | copy indirection |
|
||||||
|
| globalVars.c:27:9:27:12 | copy indirection | semmle.label | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:30:15:30:18 | copy indirection | semmle.label | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | copy indirection | semmle.label | copy indirection |
|
||||||
|
| globalVars.c:30:15:30:18 | printWrapper output argument | semmle.label | printWrapper output argument |
|
||||||
|
| globalVars.c:33:15:33:18 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:35:11:35:14 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:35:11:35:14 | copy | semmle.label | copy |
|
||||||
|
| globalVars.c:38:9:38:13 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:38:9:38:13 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
|
| globalVars.c:41:15:41:19 | printWrapper output argument | semmle.label | printWrapper output argument |
|
||||||
|
| globalVars.c:44:15:44:19 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:50:9:50:13 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:50:9:50:13 | (const char *)... | semmle.label | (const char *)... |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | semmle.label | copy2 |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 indirection | semmle.label | copy2 indirection |
|
||||||
#select
|
#select
|
||||||
|
| globalVars.c:27:9:27:12 | copy | globalVars.c:24:11:24:14 | argv | globalVars.c:27:9:27:12 | copy | The value of this argument may come from $@ and is being used as a formatting argument to printf(format) | globalVars.c:24:11:24:14 | argv | argv |
|
||||||
|
| globalVars.c:30:15:30:18 | copy | globalVars.c:24:11:24:14 | argv | globalVars.c:30:15:30:18 | copy | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format) | globalVars.c:24:11:24:14 | argv | argv |
|
||||||
|
| globalVars.c:38:9:38:13 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:38:9:38:13 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printf(format) | globalVars.c:24:11:24:14 | argv | argv |
|
||||||
|
| globalVars.c:41:15:41:19 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:41:15:41:19 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format) | globalVars.c:24:11:24:14 | argv | argv |
|
||||||
|
| globalVars.c:50:9:50:13 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:50:9:50:13 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printf(format) | globalVars.c:24:11:24:14 | argv | argv |
|
||||||
|
|||||||
Reference in New Issue
Block a user