Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 03159bb

Browse files
committed
Python points-to: Track 'unknown' value through simple iteration.
1 parent 9af7071 commit 03159bb

3 files changed

Lines changed: 42 additions & 36 deletions

File tree

python/ql/src/semmle/python/pointsto/PointsTo.qll

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,8 @@ cached module PointsToInternal {
409409
scope_entry_points_to(def, context, value, origin)
410410
or
411411
InterModulePointsTo::implicit_submodule_points_to(def, context, value, origin)
412-
// or
413-
// iteration_definition_points_to(def, context, value, origin)
412+
or
413+
iteration_definition_points_to(def, context, value, origin)
414414
/*
415415
* No points-to for non-local function entry definitions yet.
416416
*/
@@ -564,6 +564,11 @@ cached module PointsToInternal {
564564
)
565565
}
566566

567+
private predicate iteration_definition_points_to(IterationDefinition def, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
568+
pointsTo(def.getSequence(), context, ObjectInternal::unknown(), _) and
569+
value = ObjectInternal::unknown() and origin = def.getDefiningNode()
570+
}
571+
567572
/** Holds if `f` is an expression node `tval if cond else fval` and points to `(value, origin)`. */
568573
private predicate if_exp_points_to(IfExprNode f, PointsToContext context, ObjectInternal value, ControlFlowNode origin) {
569574
pointsTo(f.getAnOperand(), context, value, origin)

python/ql/test/library-tests/PointsTo/new/PointsToUnknown.expected

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
| a_simple.py:24 | ControlFlowNode for x | 23 |
55
| a_simple.py:29 | ControlFlowNode for x | 27 |
66
| a_simple.py:35 | ControlFlowNode for Subscript | 35 |
7+
| a_simple.py:35 | ControlFlowNode for UnaryExpr | 35 |
78
| a_simple.py:35 | ControlFlowNode for args | 34 |
89
| a_simple.py:36 | ControlFlowNode for Subscript | 36 |
10+
| a_simple.py:36 | ControlFlowNode for UnaryExpr | 36 |
911
| a_simple.py:36 | ControlFlowNode for kwargs | 34 |
1012
| b_condition.py:5 | ControlFlowNode for IfExp | 5 |
1113
| b_condition.py:5 | ControlFlowNode for cond | 5 |
1214
| b_condition.py:5 | ControlFlowNode for unknown | 5 |
1315
| b_condition.py:5 | ControlFlowNode for unknown() | 5 |
14-
| b_condition.py:5 | ControlFlowNode for x | 5 |
1516
| b_condition.py:7 | ControlFlowNode for x | 5 |
1617
| b_condition.py:9 | ControlFlowNode for use | 9 |
1718
| b_condition.py:9 | ControlFlowNode for use() | 9 |
@@ -20,7 +21,6 @@
2021
| b_condition.py:11 | ControlFlowNode for cond | 11 |
2122
| b_condition.py:11 | ControlFlowNode for unknown | 11 |
2223
| b_condition.py:11 | ControlFlowNode for unknown() | 11 |
23-
| b_condition.py:11 | ControlFlowNode for x | 11 |
2424
| b_condition.py:13 | ControlFlowNode for x | 11 |
2525
| b_condition.py:15 | ControlFlowNode for use | 15 |
2626
| b_condition.py:15 | ControlFlowNode for use() | 15 |
@@ -29,7 +29,7 @@
2929
| b_condition.py:17 | ControlFlowNode for cond | 17 |
3030
| b_condition.py:17 | ControlFlowNode for unknown | 17 |
3131
| b_condition.py:17 | ControlFlowNode for unknown() | 17 |
32-
| b_condition.py:17 | ControlFlowNode for x | 17 |
32+
| b_condition.py:19 | ControlFlowNode for UnaryExpr | 19 |
3333
| b_condition.py:19 | ControlFlowNode for x | 17 |
3434
| b_condition.py:21 | ControlFlowNode for use | 21 |
3535
| b_condition.py:21 | ControlFlowNode for use() | 21 |
@@ -38,7 +38,6 @@
3838
| b_condition.py:23 | ControlFlowNode for cond | 23 |
3939
| b_condition.py:23 | ControlFlowNode for unknown | 23 |
4040
| b_condition.py:23 | ControlFlowNode for unknown() | 23 |
41-
| b_condition.py:23 | ControlFlowNode for x | 23 |
4241
| b_condition.py:25 | ControlFlowNode for IfExp | 23 |
4342
| b_condition.py:25 | ControlFlowNode for x | 23 |
4443
| b_condition.py:26 | ControlFlowNode for use | 26 |
@@ -53,7 +52,7 @@
5352
| b_condition.py:31 | ControlFlowNode for cond | 31 |
5453
| b_condition.py:31 | ControlFlowNode for unknown | 31 |
5554
| b_condition.py:31 | ControlFlowNode for unknown() | 31 |
56-
| b_condition.py:31 | ControlFlowNode for x | 31 |
55+
| b_condition.py:32 | ControlFlowNode for UnaryExpr | 32 |
5756
| b_condition.py:32 | ControlFlowNode for x | 31 |
5857
| b_condition.py:34 | ControlFlowNode for use | 34 |
5958
| b_condition.py:34 | ControlFlowNode for use() | 34 |
@@ -64,16 +63,14 @@
6463
| b_condition.py:37 | ControlFlowNode for x | 31 |
6564
| b_condition.py:39 | ControlFlowNode for thing | 39 |
6665
| b_condition.py:39 | ControlFlowNode for thing() | 39 |
67-
| b_condition.py:39 | ControlFlowNode for v2 | 39 |
68-
| b_condition.py:41 | ControlFlowNode for Attribute | 39 |
6966
| b_condition.py:41 | ControlFlowNode for v2 | 39 |
70-
| b_condition.py:42 | ControlFlowNode for Attribute | 39 |
67+
| b_condition.py:42 | ControlFlowNode for Attribute | 42 |
7168
| b_condition.py:42 | ControlFlowNode for v2 | 39 |
72-
| b_condition.py:43 | ControlFlowNode for Attribute | 39 |
69+
| b_condition.py:43 | ControlFlowNode for Attribute | 43 |
7370
| b_condition.py:43 | ControlFlowNode for use | 43 |
7471
| b_condition.py:43 | ControlFlowNode for use() | 43 |
7572
| b_condition.py:43 | ControlFlowNode for v2 | 39 |
76-
| b_condition.py:44 | ControlFlowNode for Attribute | 39 |
73+
| b_condition.py:44 | ControlFlowNode for Attribute | 44 |
7774
| b_condition.py:44 | ControlFlowNode for use | 44 |
7875
| b_condition.py:44 | ControlFlowNode for use() | 44 |
7976
| b_condition.py:44 | ControlFlowNode for v2 | 39 |
@@ -84,19 +81,19 @@
8481
| b_condition.py:58 | ControlFlowNode for use | 58 |
8582
| b_condition.py:58 | ControlFlowNode for use() | 58 |
8683
| b_condition.py:58 | ControlFlowNode for v | 56 |
87-
| b_condition.py:62 | ControlFlowNode for Attribute | 61 |
84+
| b_condition.py:62 | ControlFlowNode for Attribute | 62 |
8885
| b_condition.py:62 | ControlFlowNode for x | 61 |
8986
| b_condition.py:64 | ControlFlowNode for y | 61 |
90-
| b_condition.py:65 | ControlFlowNode for Attribute | 61 |
87+
| b_condition.py:65 | ControlFlowNode for Attribute | 65 |
9188
| b_condition.py:65 | ControlFlowNode for x | 61 |
92-
| b_condition.py:66 | ControlFlowNode for Attribute | 61 |
89+
| b_condition.py:66 | ControlFlowNode for Attribute | 66 |
9390
| b_condition.py:66 | ControlFlowNode for seq | 66 |
9491
| b_condition.py:66 | ControlFlowNode for x | 61 |
9592
| b_condition.py:70 | ControlFlowNode for IfExp | 70 |
96-
| b_condition.py:70 | ControlFlowNode for b | 70 |
9793
| b_condition.py:70 | ControlFlowNode for cond | 70 |
9894
| b_condition.py:70 | ControlFlowNode for unknown | 70 |
9995
| b_condition.py:70 | ControlFlowNode for unknown() | 70 |
96+
| b_condition.py:71 | ControlFlowNode for UnaryExpr | 71 |
10097
| b_condition.py:71 | ControlFlowNode for b | 70 |
10198
| b_condition.py:73 | ControlFlowNode for b | 70 |
10299
| b_condition.py:79 | ControlFlowNode for use | 79 |
@@ -120,84 +117,80 @@
120117
| b_condition.py:99 | ControlFlowNode for use | 99 |
121118
| b_condition.py:99 | ControlFlowNode for use() | 99 |
122119
| b_condition.py:102 | ControlFlowNode for a | 101 |
120+
| b_condition.py:104 | ControlFlowNode for UnaryExpr | 104 |
123121
| b_condition.py:104 | ControlFlowNode for a | 101 |
124122
| b_condition.py:105 | ControlFlowNode for Subscript | 105 |
123+
| b_condition.py:105 | ControlFlowNode for UnaryExpr | 105 |
125124
| b_condition.py:105 | ControlFlowNode for a | 101 |
126125
| c_tests.py:5 | ControlFlowNode for IfExp | 5 |
127126
| c_tests.py:5 | ControlFlowNode for cond | 5 |
128127
| c_tests.py:5 | ControlFlowNode for unknown | 5 |
129128
| c_tests.py:5 | ControlFlowNode for unknown() | 5 |
130-
| c_tests.py:5 | ControlFlowNode for x | 5 |
131129
| c_tests.py:7 | ControlFlowNode for x | 5 |
132130
| c_tests.py:10 | ControlFlowNode for cond | 10 |
133131
| c_tests.py:15 | ControlFlowNode for cond | 15 |
134132
| c_tests.py:21 | ControlFlowNode for cond | 21 |
135133
| c_tests.py:21 | ControlFlowNode for unknown | 21 |
136134
| c_tests.py:21 | ControlFlowNode for unknown() | 21 |
137-
| c_tests.py:32 | ControlFlowNode for Attribute | 4 |
138-
| c_tests.py:32 | ControlFlowNode for Attribute | 32 |
139135
| c_tests.py:32 | ControlFlowNode for IfExp | 32 |
140136
| c_tests.py:32 | ControlFlowNode for cond | 32 |
141137
| c_tests.py:32 | ControlFlowNode for unknown | 32 |
142138
| c_tests.py:32 | ControlFlowNode for unknown() | 32 |
143139
| c_tests.py:32 | ControlFlowNode for y | 4 |
144-
| c_tests.py:34 | ControlFlowNode for Attribute | 4 |
145-
| c_tests.py:34 | ControlFlowNode for Attribute | 32 |
140+
| c_tests.py:34 | ControlFlowNode for Attribute | 34 |
146141
| c_tests.py:34 | ControlFlowNode for y | 4 |
147-
| c_tests.py:37 | ControlFlowNode for Attribute | 4 |
148142
| c_tests.py:37 | ControlFlowNode for cond | 37 |
149143
| c_tests.py:37 | ControlFlowNode for y | 4 |
150-
| c_tests.py:39 | ControlFlowNode for Attribute | 4 |
144+
| c_tests.py:39 | ControlFlowNode for Attribute | 39 |
151145
| c_tests.py:39 | ControlFlowNode for y | 4 |
152-
| c_tests.py:42 | ControlFlowNode for Attribute | 4 |
153146
| c_tests.py:42 | ControlFlowNode for cond | 42 |
154147
| c_tests.py:42 | ControlFlowNode for y | 4 |
155-
| c_tests.py:44 | ControlFlowNode for Attribute | 4 |
148+
| c_tests.py:44 | ControlFlowNode for Attribute | 44 |
156149
| c_tests.py:44 | ControlFlowNode for y | 4 |
157-
| c_tests.py:48 | ControlFlowNode for Attribute | 4 |
158150
| c_tests.py:48 | ControlFlowNode for cond | 48 |
159151
| c_tests.py:48 | ControlFlowNode for unknown | 48 |
160152
| c_tests.py:48 | ControlFlowNode for unknown() | 48 |
161153
| c_tests.py:48 | ControlFlowNode for y | 4 |
162-
| c_tests.py:50 | ControlFlowNode for Attribute | 4 |
154+
| c_tests.py:50 | ControlFlowNode for Attribute | 50 |
163155
| c_tests.py:50 | ControlFlowNode for y | 4 |
164-
| c_tests.py:53 | ControlFlowNode for Attribute | 4 |
156+
| c_tests.py:53 | ControlFlowNode for Attribute | 53 |
165157
| c_tests.py:53 | ControlFlowNode for y | 4 |
166158
| c_tests.py:58 | ControlFlowNode for cond | 58 |
167159
| c_tests.py:63 | ControlFlowNode for cond | 63 |
160+
| c_tests.py:65 | ControlFlowNode for hasattr() | 65 |
168161
| c_tests.py:73 | ControlFlowNode for x | 71 |
169162
| c_tests.py:73 | ControlFlowNode for y | 71 |
163+
| c_tests.py:74 | ControlFlowNode for BinaryExpr | 74 |
170164
| c_tests.py:74 | ControlFlowNode for x | 71 |
171165
| c_tests.py:74 | ControlFlowNode for y | 71 |
172166
| c_tests.py:76 | ControlFlowNode for x | 71 |
173167
| c_tests.py:76 | ControlFlowNode for y | 71 |
168+
| c_tests.py:77 | ControlFlowNode for BinaryExpr | 77 |
174169
| c_tests.py:77 | ControlFlowNode for x | 71 |
175170
| c_tests.py:77 | ControlFlowNode for y | 71 |
176171
| c_tests.py:80 | ControlFlowNode for IfExp | 80 |
177-
| c_tests.py:80 | ControlFlowNode for b | 80 |
178172
| c_tests.py:80 | ControlFlowNode for cond | 80 |
179173
| c_tests.py:80 | ControlFlowNode for unknown | 80 |
180174
| c_tests.py:80 | ControlFlowNode for unknown() | 80 |
181175
| c_tests.py:81 | ControlFlowNode for b | 80 |
182176
| c_tests.py:83 | ControlFlowNode for IfExp | 83 |
183-
| c_tests.py:83 | ControlFlowNode for b | 83 |
184177
| c_tests.py:83 | ControlFlowNode for cond | 83 |
185178
| c_tests.py:83 | ControlFlowNode for unknown | 83 |
186179
| c_tests.py:83 | ControlFlowNode for unknown() | 83 |
180+
| c_tests.py:84 | ControlFlowNode for UnaryExpr | 84 |
187181
| c_tests.py:84 | ControlFlowNode for b | 83 |
188182
| c_tests.py:87 | ControlFlowNode for unknown | 87 |
189183
| c_tests.py:87 | ControlFlowNode for unknown() | 87 |
190184
| c_tests.py:90 | ControlFlowNode for IfExp | 90 |
191185
| c_tests.py:90 | ControlFlowNode for cond | 90 |
192186
| c_tests.py:90 | ControlFlowNode for unknown | 90 |
193187
| c_tests.py:90 | ControlFlowNode for unknown() | 90 |
194-
| c_tests.py:90 | ControlFlowNode for x | 90 |
195188
| c_tests.py:91 | ControlFlowNode for x | 90 |
196189
| c_tests.py:94 | ControlFlowNode for IfExp | 94 |
197190
| c_tests.py:94 | ControlFlowNode for cond | 94 |
198191
| c_tests.py:94 | ControlFlowNode for unknown | 94 |
199192
| c_tests.py:94 | ControlFlowNode for unknown() | 94 |
200-
| c_tests.py:94 | ControlFlowNode for x | 94 |
193+
| c_tests.py:95 | ControlFlowNode for UnaryExpr | 95 |
201194
| c_tests.py:95 | ControlFlowNode for x | 94 |
202195
| c_tests.py:99 | ControlFlowNode for bar | 99 |
203196
| c_tests.py:99 | ControlFlowNode for bar() | 99 |
@@ -206,30 +199,37 @@
206199
| c_tests.py:99 | ControlFlowNode for x | 98 |
207200
| c_tests.py:100 | ControlFlowNode for use | 100 |
208201
| c_tests.py:100 | ControlFlowNode for use() | 100 |
209-
| c_tests.py:100 | ControlFlowNode for x | 98 |
210202
| h_classes.py:12 | ControlFlowNode for name | 12 |
211203
| h_classes.py:17 | ControlFlowNode for arg | 14 |
212204
| h_classes.py:18 | ControlFlowNode for name | 18 |
213205
| h_classes.py:26 | ControlFlowNode for choice | 25 |
214206
| h_classes.py:28 | ControlFlowNode for choice | 25 |
215207
| h_classes.py:42 | ControlFlowNode for unknown | 42 |
216208
| h_classes.py:42 | ControlFlowNode for unknown() | 42 |
209+
| r_regressions.py:9 | ControlFlowNode for Attribute | 9 |
210+
| r_regressions.py:9 | ControlFlowNode for Attribute() | 9 |
211+
| r_regressions.py:18 | ControlFlowNode for Attribute | 18 |
212+
| r_regressions.py:18 | ControlFlowNode for Attribute() | 18 |
213+
| r_regressions.py:20 | ControlFlowNode for Attribute | 20 |
214+
| r_regressions.py:21 | ControlFlowNode for close | 20 |
215+
| r_regressions.py:23 | ControlFlowNode for close | 20 |
216+
| r_regressions.py:23 | ControlFlowNode for close() | 23 |
217217
| r_regressions.py:29 | ControlFlowNode for x | 27 |
218218
| r_regressions.py:31 | ControlFlowNode for y | 27 |
219219
| r_regressions.py:33 | ControlFlowNode for y | 27 |
220+
| r_regressions.py:35 | ControlFlowNode for UnaryExpr | 35 |
220221
| r_regressions.py:36 | ControlFlowNode for z | 27 |
221222
| r_regressions.py:39 | ControlFlowNode for use | 39 |
222223
| r_regressions.py:39 | ControlFlowNode for use() | 39 |
223224
| r_regressions.py:39 | ControlFlowNode for y | 27 |
224-
| r_regressions.py:43 | ControlFlowNode for List | 43 |
225225
| r_regressions.py:43 | ControlFlowNode for x | 43 |
226226
| r_regressions.py:43 | ControlFlowNode for x() | 43 |
227227
| r_regressions.py:52 | ControlFlowNode for msg | 51 |
228228
| r_regressions.py:64 | ControlFlowNode for do_validation | 64 |
229229
| r_regressions.py:64 | ControlFlowNode for do_validation() | 64 |
230+
| r_regressions.py:73 | ControlFlowNode for setattr() | 73 |
230231
| r_regressions.py:90 | ControlFlowNode for Attribute | 90 |
231232
| r_regressions.py:90 | ControlFlowNode for Attribute() | 90 |
232233
| r_regressions.py:102 | ControlFlowNode for unrelated_call | 102 |
233234
| r_regressions.py:102 | ControlFlowNode for unrelated_call() | 102 |
234-
| r_regressions.py:107 | ControlFlowNode for Attribute | 106 |
235235
| r_regressions.py:107 | ControlFlowNode for x | 106 |
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import python
22
import Util
33
import semmle.python.pointsto.PointsTo
4+
import semmle.python.objects.ObjectInternal
45

56
from ControlFlowNode f, ControlFlowNode x
67

7-
where PointsTo::points_to(f, _, unknownValue(), _, x)
8+
where PointsTo::pointsTo(f, _, ObjectInternal::unknown(), x)
89

910
select locate(f.getLocation(), "abchr"), f.toString(), x.getLocation().getStartLine()

0 commit comments

Comments
 (0)