mirror of
https://github.com/github/codeql.git
synced 2025-12-21 03:06:31 +01:00
Python: attempt at capturing maximal flows
(this is what used to be "all flows")
This commit is contained in:
13
python/ql/test/experimental/dataflow/maximalFlows.expected
Normal file
13
python/ql/test/experimental/dataflow/maximalFlows.expected
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
| test.py:0:0:0:0 | GSSA Variable __name__ | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:0:0:0:0 | GSSA Variable __package__ | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:0:0:0:0 | GSSA Variable b | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:1:5:1:17 | GSSA Variable obfuscated_id | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:1:19:1:19 | SSA variable x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||||
|
| test.py:1:19:1:19 | SSA variable x | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:2:3:2:3 | SSA variable y | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||||
|
| test.py:2:3:2:3 | SSA variable y | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:3:3:3:3 | SSA variable z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||||
|
| test.py:3:3:3:3 | SSA variable z | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:6:1:6:1 | GSSA Variable a | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||||
|
| test.py:6:1:6:1 | GSSA Variable a | test.py:7:1:7:1 | GSSA Variable b |
|
||||||
|
| test.py:6:1:6:1 | GSSA Variable a | test.py:7:5:7:20 | GSSA Variable a |
|
||||||
10
python/ql/test/experimental/dataflow/maximalFlows.ql
Normal file
10
python/ql/test/experimental/dataflow/maximalFlows.ql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import maximalFlowsConfig
|
||||||
|
|
||||||
|
from
|
||||||
|
DataFlow::Node source,
|
||||||
|
DataFlow::Node sink
|
||||||
|
where
|
||||||
|
source != sink and
|
||||||
|
exists(MaximalFlowsConfig cfg | cfg.hasFlow(source, sink))
|
||||||
|
select
|
||||||
|
source, sink
|
||||||
26
python/ql/test/experimental/dataflow/maximalFlowsConfig.qll
Normal file
26
python/ql/test/experimental/dataflow/maximalFlowsConfig.qll
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import experimental.dataflow.DataFlow
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A configuration to find all "maximal" flows.
|
||||||
|
* To be used on small programs.
|
||||||
|
*/
|
||||||
|
class MaximalFlowsConfig extends DataFlow::Configuration {
|
||||||
|
MaximalFlowsConfig() { this = "AllFlowsConfig" }
|
||||||
|
|
||||||
|
override predicate isSource(DataFlow::Node node) {
|
||||||
|
node instanceof DataFlow::ParameterNode
|
||||||
|
or
|
||||||
|
node = DataFlow::TEssaNode(_) and
|
||||||
|
not exists(DataFlow::Node pred |
|
||||||
|
pred = DataFlow::TEssaNode(_) and
|
||||||
|
DataFlow::localFlowStep(pred, node)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override predicate isSink(DataFlow::Node node) {
|
||||||
|
node instanceof DataFlow::ReturnNode
|
||||||
|
or
|
||||||
|
node = DataFlow::TEssaNode(_) and
|
||||||
|
not exists(node.asEssaNode().getASourceUse())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user