mirror of
https://github.com/github/codeql.git
synced 2026-04-28 02:05:14 +02:00
Python: rewrite test
This commit is contained in:
@@ -1,58 +0,0 @@
|
||||
| base.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | base.py:1:1:1:3 | GSSA Variable foo |
|
||||
| m1.py:2:7:2:8 | ControlFlowNode for IntegerLiteral | m1.py:2:1:2:3 | GSSA Variable foo |
|
||||
| m1.py:4:8:4:11 | ControlFlowNode for ImportExpr | m1.py:4:8:4:11 | GSSA Variable base |
|
||||
| m1.py:4:8:4:11 | GSSA Variable base | m1.py:10:14:10:17 | ControlFlowNode for base |
|
||||
| m1.py:6:1:6:14 | ControlFlowNode for FunctionExpr | m1.py:6:5:6:10 | GSSA Variable passOn |
|
||||
| m1.py:6:5:6:10 | GSSA Variable passOn | m1.py:10:7:10:12 | ControlFlowNode for passOn |
|
||||
| m1.py:10:7:10:22 | ControlFlowNode for passOn() | m1.py:10:1:10:3 | GSSA Variable bar |
|
||||
| multiphase.py:0:0:0:0 | GSSA Variable __file__ | multiphase.py:4:50:4:57 | ControlFlowNode for __file__ |
|
||||
| multiphase.py:0:0:0:0 | GSSA Variable expects | multiphase.py:37:2:37:8 | ControlFlowNode for expects |
|
||||
| multiphase.py:1:8:1:10 | ControlFlowNode for ImportExpr | multiphase.py:1:8:1:10 | GSSA Variable sys |
|
||||
| multiphase.py:1:8:1:10 | GSSA Variable sys | multiphase.py:4:1:4:3 | ControlFlowNode for sys |
|
||||
| multiphase.py:2:8:2:9 | ControlFlowNode for ImportExpr | multiphase.py:2:8:2:9 | GSSA Variable os |
|
||||
| multiphase.py:2:8:2:9 | GSSA Variable os | multiphase.py:4:17:4:18 | ControlFlowNode for os |
|
||||
| multiphase.py:4:17:4:18 | ControlFlowNode for os | multiphase.py:4:33:4:34 | ControlFlowNode for os |
|
||||
| multiphase.py:4:17:4:18 | [post read] ControlFlowNode for os | multiphase.py:4:33:4:34 | ControlFlowNode for os |
|
||||
| multiphase.py:8:1:8:9 | ControlFlowNode for NONSOURCE | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable NONSOURCE in Module multiphase |
|
||||
| multiphase.py:8:1:8:9 | GSSA Variable NONSOURCE | multiphase.py:34:7:34:15 | ControlFlowNode for NONSOURCE |
|
||||
| multiphase.py:8:13:8:26 | ControlFlowNode for Str | multiphase.py:8:1:8:9 | GSSA Variable NONSOURCE |
|
||||
| multiphase.py:9:1:9:6 | ControlFlowNode for SOURCE | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module multiphase |
|
||||
| multiphase.py:9:10:9:17 | ControlFlowNode for Str | multiphase.py:9:1:9:6 | GSSA Variable SOURCE |
|
||||
| multiphase.py:12:1:12:17 | ControlFlowNode for FunctionExpr | multiphase.py:12:5:12:13 | GSSA Variable is_source |
|
||||
| multiphase.py:12:5:12:13 | ControlFlowNode for is_source | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable is_source in Module multiphase |
|
||||
| multiphase.py:16:1:16:12 | ControlFlowNode for FunctionExpr | multiphase.py:16:5:16:8 | GSSA Variable SINK |
|
||||
| multiphase.py:16:5:16:8 | ControlFlowNode for SINK | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable SINK in Module multiphase |
|
||||
| multiphase.py:23:1:23:14 | ControlFlowNode for FunctionExpr | multiphase.py:23:5:23:10 | GSSA Variable SINK_F |
|
||||
| multiphase.py:29:1:29:14 | ControlFlowNode for FunctionExpr | multiphase.py:29:5:29:11 | GSSA Variable set_foo |
|
||||
| multiphase.py:29:5:29:11 | ControlFlowNode for set_foo | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable set_foo in Module multiphase |
|
||||
| multiphase.py:29:5:29:11 | GSSA Variable set_foo | multiphase.py:35:1:35:7 | ControlFlowNode for set_foo |
|
||||
| multiphase.py:34:1:34:3 | ControlFlowNode for foo | multiphase.py:0:0:0:0 | ModuleVariableNode for Global Variable foo in Module multiphase |
|
||||
| multiphase.py:34:7:34:15 | ControlFlowNode for NONSOURCE | multiphase.py:34:1:34:3 | GSSA Variable foo |
|
||||
| multiphase.py:37:2:37:11 | ControlFlowNode for expects()() | multiphase.py:38:5:38:15 | GSSA Variable test_phases |
|
||||
| test.py:2:13:2:26 | ControlFlowNode for Str | test.py:2:1:2:9 | GSSA Variable NONSOURCE |
|
||||
| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE |
|
||||
| test.py:6:1:6:17 | ControlFlowNode for FunctionExpr | test.py:6:5:6:13 | GSSA Variable is_source |
|
||||
| test.py:6:5:6:13 | ControlFlowNode for is_source | test.py:0:0:0:0 | ModuleVariableNode for Global Variable is_source in Module test |
|
||||
| test.py:10:1:10:12 | ControlFlowNode for FunctionExpr | test.py:10:5:10:8 | GSSA Variable SINK |
|
||||
| test.py:10:5:10:8 | ControlFlowNode for SINK | test.py:0:0:0:0 | ModuleVariableNode for Global Variable SINK in Module test |
|
||||
| test.py:17:1:17:14 | ControlFlowNode for FunctionExpr | test.py:17:5:17:10 | GSSA Variable SINK_F |
|
||||
| test.py:23:8:23:11 | ControlFlowNode for ImportExpr | test.py:23:8:23:11 | GSSA Variable base |
|
||||
| test.py:23:8:23:11 | GSSA Variable base | test.py:25:1:25:4 | ControlFlowNode for base |
|
||||
| test.py:27:8:27:9 | ControlFlowNode for ImportExpr | test.py:27:8:27:9 | GSSA Variable m1 |
|
||||
| test.py:27:8:27:9 | ControlFlowNode for m1 | test.py:0:0:0:0 | ModuleVariableNode for Global Variable m1 in Module test |
|
||||
| test.py:29:1:29:17 | ControlFlowNode for FunctionExpr | test.py:29:5:29:14 | GSSA Variable test_const |
|
||||
| test.py:32:1:32:23 | ControlFlowNode for FunctionExpr | test.py:32:5:32:20 | GSSA Variable test_overwritten |
|
||||
| testOnce.py:2:13:2:26 | ControlFlowNode for Str | testOnce.py:2:1:2:9 | GSSA Variable NONSOURCE |
|
||||
| testOnce.py:3:10:3:17 | ControlFlowNode for Str | testOnce.py:3:1:3:6 | GSSA Variable SOURCE |
|
||||
| testOnce.py:6:1:6:17 | ControlFlowNode for FunctionExpr | testOnce.py:6:5:6:13 | GSSA Variable is_source |
|
||||
| testOnce.py:6:5:6:13 | ControlFlowNode for is_source | testOnce.py:0:0:0:0 | ModuleVariableNode for Global Variable is_source in Module testOnce |
|
||||
| testOnce.py:10:1:10:12 | ControlFlowNode for FunctionExpr | testOnce.py:10:5:10:8 | GSSA Variable SINK |
|
||||
| testOnce.py:10:5:10:8 | ControlFlowNode for SINK | testOnce.py:0:0:0:0 | ModuleVariableNode for Global Variable SINK in Module testOnce |
|
||||
| testOnce.py:17:1:17:14 | ControlFlowNode for FunctionExpr | testOnce.py:17:5:17:10 | GSSA Variable SINK_F |
|
||||
| testOnce.py:17:5:17:10 | ControlFlowNode for SINK_F | testOnce.py:0:0:0:0 | ModuleVariableNode for Global Variable SINK_F in Module testOnce |
|
||||
| testOnce.py:23:8:23:9 | ControlFlowNode for ImportExpr | testOnce.py:23:8:23:9 | GSSA Variable m1 |
|
||||
| testOnce.py:23:8:23:9 | ControlFlowNode for m1 | testOnce.py:0:0:0:0 | ModuleVariableNode for Global Variable m1 in Module testOnce |
|
||||
| testOnce.py:25:8:25:11 | ControlFlowNode for ImportExpr | testOnce.py:25:8:25:11 | GSSA Variable base |
|
||||
| testOnce.py:25:8:25:11 | GSSA Variable base | testOnce.py:27:1:27:4 | ControlFlowNode for base |
|
||||
| testOnce.py:29:1:29:17 | ControlFlowNode for FunctionExpr | testOnce.py:29:5:29:14 | GSSA Variable test_const |
|
||||
| testOnce.py:32:1:32:25 | ControlFlowNode for FunctionExpr | testOnce.py:32:5:32:22 | GSSA Variable test_unoverwritten |
|
||||
|
||||
@@ -1,21 +1,40 @@
|
||||
// This query should be more focused yet.
|
||||
import python
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
import experimental.dataflow.TestUtil.FlowTest
|
||||
private import semmle.python.dataflow.new.internal.PrintNode
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate as DP
|
||||
|
||||
pragma[inline]
|
||||
predicate inCodebase(DataFlow::Node node) { exists(node.getLocation().getFile().getRelativePath()) }
|
||||
class ImportTimeLocalFlowTest extends InlineExpectationsTest {
|
||||
ImportTimeLocalFlowTest() { this = "ImportTimeLocalFlowTest" }
|
||||
|
||||
pragma[inline]
|
||||
predicate isTopLevel(DataFlow::Node node) { node.getScope() instanceof Module }
|
||||
override string getARelevantTag() { result = "importTimeFlow" }
|
||||
|
||||
predicate inFocus(DataFlow::Node node) {
|
||||
isTopLevel(node) and
|
||||
inCodebase(node)
|
||||
override predicate hasActualResult(Location location, string element, string tag, string value) {
|
||||
exists(DataFlow::Node nodeFrom, DataFlow::ModuleVariableNode nodeTo |
|
||||
DP::importTimeLocalFlowStep(nodeFrom, nodeTo)
|
||||
|
|
||||
nodeFrom.getLocation().getFile().getBaseName() = "multiphase.py" and
|
||||
location = nodeFrom.getLocation() and
|
||||
tag = "importTimeFlow" and
|
||||
value = "\"" + prettyNode(nodeTo).replaceAll("\"", "'") + "\"" and
|
||||
element = nodeTo.toString()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
from DataFlow::Node nodeFrom, DataFlow::Node nodeTo
|
||||
where
|
||||
inFocus(nodeFrom) and
|
||||
inFocus(nodeTo) and
|
||||
DataFlow::localFlowStep(nodeFrom, nodeTo)
|
||||
select nodeFrom, nodeTo
|
||||
class RuntimeLocalFlowTest extends FlowTest {
|
||||
RuntimeLocalFlowTest() { this = "RuntimeLocalFlowTest" }
|
||||
|
||||
override string flowTag() { result = "runtimFlow" }
|
||||
|
||||
override predicate relevantFlow(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
|
||||
nodeFrom.getLocation().getFile().getBaseName() = "multiphase.py" and
|
||||
// results are displayed next to `nodeTo`, so we need a line to write on
|
||||
nodeTo.getLocation().getStartLine() > 0 and
|
||||
(
|
||||
nodeFrom instanceof DataFlow::ModuleVariableNode or
|
||||
nodeTo instanceof DataFlow::ModuleVariableNode
|
||||
) and
|
||||
DP::runtimeJumpStep(nodeFrom, nodeTo)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,39 +5,38 @@ sys.path.append(os.path.dirname(os.path.dirname((__file__))))
|
||||
from testlib import *
|
||||
|
||||
# These are defined so that we can evaluate the test code.
|
||||
NONSOURCE = "not a source"
|
||||
SOURCE = "source"
|
||||
NONSOURCE = "not a source" #$ importTimeFlow="ModuleVariableNode for Global Variable NONSOURCE in Module multiphase"
|
||||
SOURCE = "source" #$ importTimeFlow="ModuleVariableNode for Global Variable SOURCE in Module multiphase"
|
||||
|
||||
|
||||
def is_source(x):
|
||||
def is_source(x): #$ importTimeFlow="ModuleVariableNode for Global Variable is_source in Module multiphase"
|
||||
return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j
|
||||
|
||||
|
||||
def SINK(x):
|
||||
if is_source(x):
|
||||
print("OK")
|
||||
def SINK(x): #$ importTimeFlow="ModuleVariableNode for Global Variable SINK in Module multiphase"
|
||||
if is_source(x): #$ runtimFlow="ModuleVariableNode for Global Variable is_source in Module multiphase, l:-17 -> is_source"
|
||||
print("OK") #$ runtimFlow="ModuleVariableNode for Global Variable print in Module multiphase, l:-18 -> print"
|
||||
else:
|
||||
print("Unexpected flow", x)
|
||||
print("Unexpected flow", x) #$ runtimFlow="ModuleVariableNode for Global Variable print in Module multiphase, l:-20 -> print"
|
||||
|
||||
|
||||
def SINK_F(x):
|
||||
if is_source(x):
|
||||
print("Unexpected flow", x)
|
||||
if is_source(x): #$ runtimFlow="ModuleVariableNode for Global Variable is_source in Module multiphase, l:-24 -> is_source"
|
||||
print("Unexpected flow", x) #$ runtimFlow="ModuleVariableNode for Global Variable print in Module multiphase, l:-25 -> print"
|
||||
else:
|
||||
print("OK")
|
||||
print("OK") #$ runtimFlow="ModuleVariableNode for Global Variable print in Module multiphase, l:-27 -> print"
|
||||
|
||||
def set_foo():
|
||||
def set_foo(): #$ importTimeFlow="ModuleVariableNode for Global Variable set_foo in Module multiphase"
|
||||
global foo
|
||||
print(foo)
|
||||
foo = SOURCE
|
||||
foo = SOURCE #$ runtimFlow="ModuleVariableNode for Global Variable SOURCE in Module multiphase, l:-31 -> SOURCE" MISSING:importTimeFlow="ModuleVariableNode for Global Variable foo in Module multiphase"
|
||||
|
||||
foo = NONSOURCE
|
||||
foo = NONSOURCE #$ importTimeFlow="ModuleVariableNode for Global Variable foo in Module multiphase"
|
||||
set_foo()
|
||||
|
||||
@expects(2)
|
||||
def test_phases():
|
||||
global foo
|
||||
SINK(foo)
|
||||
foo = NONSOURCE
|
||||
set_foo()
|
||||
SINK(foo)
|
||||
SINK(foo) #$ runtimFlow="ModuleVariableNode for Global Variable SINK in Module multiphase, l:-39 -> SINK" runtimFlow="ModuleVariableNode for Global Variable foo in Module multiphase, l:-39 -> foo"
|
||||
foo = NONSOURCE #$ runtimFlow="ModuleVariableNode for Global Variable NONSOURCE in Module multiphase, l:-40 -> NONSOURCE"
|
||||
set_foo() #$ runtimFlow="ModuleVariableNode for Global Variable set_foo in Module multiphase, l:-41 -> set_foo"
|
||||
SINK(foo) #$ runtimFlow="ModuleVariableNode for Global Variable SINK in Module multiphase, l:-42 -> SINK" runtimFlow="ModuleVariableNode for Global Variable foo in Module multiphase, l:-42 -> foo"
|
||||
|
||||
Reference in New Issue
Block a user