File tree Expand file tree Collapse file tree 2 files changed +103
-0
lines changed
python/ql/test/experimental/dataflow Expand file tree Collapse file tree 2 files changed +103
-0
lines changed Original file line number Diff line number Diff line change @@ -68,6 +68,7 @@ def check_tests_valid_after_version(testFile, version):
68
68
check_tests_valid ("coverage-py3.classes" )
69
69
check_tests_valid ("variable-capture.in" )
70
70
check_tests_valid ("variable-capture.nonlocal" )
71
+ check_tests_valid ("variable-capture.global" )
71
72
check_tests_valid ("variable-capture.dict" )
72
73
check_tests_valid ("variable-capture.test_collections" )
73
74
check_tests_valid ("module-initialization.multiphase" )
Original file line number Diff line number Diff line change
1
+ # Here we test writing to a captured variable via the `nonlocal` keyword (see `out`).
2
+ # We also test reading one captured variable and writing the value to another (see `through`).
3
+
4
+ # All functions starting with "test_" should run and execute `print("OK")` exactly once.
5
+ # This can be checked by running validTest.py.
6
+
7
+ import sys
8
+ import os
9
+
10
+ sys .path .append (os .path .dirname (os .path .dirname ((__file__ ))))
11
+ from testlib import expects
12
+
13
+ # These are defined so that we can evaluate the test code.
14
+ NONSOURCE = "not a source"
15
+ SOURCE = "source"
16
+
17
+ def is_source (x ):
18
+ return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j
19
+
20
+
21
+ def SINK (x ):
22
+ if is_source (x ):
23
+ print ("OK" )
24
+ else :
25
+ print ("Unexpected flow" , x )
26
+
27
+
28
+ def SINK_F (x ):
29
+ if is_source (x ):
30
+ print ("Unexpected flow" , x )
31
+ else :
32
+ print ("OK" )
33
+
34
+
35
+ sinkO1 = ""
36
+ sinkO2 = ""
37
+ nonSink0 = ""
38
+
39
+ def out ():
40
+ def captureOut1 ():
41
+ global sinkO1
42
+ sinkO1 = SOURCE
43
+ captureOut1 ()
44
+ SINK (sinkO1 ) #$ captured
45
+
46
+ def captureOut2 ():
47
+ def m ():
48
+ global sinkO2
49
+ sinkO2 = SOURCE
50
+ m ()
51
+ captureOut2 ()
52
+ SINK (sinkO2 ) #$ captured
53
+
54
+ def captureOut1NotCalled ():
55
+ global nonSink0
56
+ nonSink0 = SOURCE
57
+ SINK_F (nonSink0 ) #$ SPURIOUS: captured
58
+
59
+ def captureOut2NotCalled ():
60
+ def m ():
61
+ global nonSink0
62
+ nonSink0 = SOURCE
63
+ captureOut2NotCalled ()
64
+ SINK_F (nonSink0 ) #$ SPURIOUS: captured
65
+
66
+ @expects (4 )
67
+ def test_out ():
68
+ out ()
69
+
70
+ sinkT1 = ""
71
+ sinkT2 = ""
72
+ nonSinkT0 = ""
73
+ def through (tainted ):
74
+ def captureOut1 ():
75
+ global sinkT1
76
+ sinkT1 = tainted
77
+ captureOut1 ()
78
+ SINK (sinkT1 ) #$ MISSING:captured
79
+
80
+ def captureOut2 ():
81
+ def m ():
82
+ global sinkT2
83
+ sinkT2 = tainted
84
+ m ()
85
+ captureOut2 ()
86
+ SINK (sinkT2 ) #$ MISSING:captured
87
+
88
+ def captureOut1NotCalled ():
89
+ global nonSinkT0
90
+ nonSinkT0 = tainted
91
+ SINK_F (nonSinkT0 )
92
+
93
+ def captureOut2NotCalled ():
94
+ def m ():
95
+ global nonSinkT0
96
+ nonSinkT0 = tainted
97
+ captureOut2NotCalled ()
98
+ SINK_F (nonSinkT0 )
99
+
100
+ @expects (4 )
101
+ def test_through ():
102
+ through (SOURCE )
You can’t perform that action at this time.
0 commit comments