File tree Expand file tree Collapse file tree 2 files changed +17
-5
lines changed
lib/semmle/python/dataflow/new/internal
test/experimental/dataflow/fieldflow Expand file tree Collapse file tree 2 files changed +17
-5
lines changed Original file line number Diff line number Diff line change @@ -1973,6 +1973,18 @@ predicate clearsContent(Node n, Content c) {
1973
1973
kwOverflowClearStep ( n , c )
1974
1974
or
1975
1975
matchClearStep ( n , c )
1976
+ or
1977
+ attributeClearStep ( n , c )
1978
+ }
1979
+
1980
+ /**
1981
+ * Holds if values stored inside attribute `c` are cleared at node `n`.
1982
+ *
1983
+ * In `obj.foo = x` the any old value stored in `foo` is cleared at the pre-update node
1984
+ * associated with `obj`
1985
+ */
1986
+ predicate attributeClearStep ( Node n , AttributeContent c ) {
1987
+ exists ( PostUpdateNode post | post .getPreUpdateNode ( ) = n | attributeStoreStep ( _, c , post ) )
1976
1988
}
1977
1989
1978
1990
//--------
Original file line number Diff line number Diff line change @@ -67,15 +67,15 @@ def test_direct_assign_overwrite():
67
67
myobj = MyObj (NONSOURCE )
68
68
myobj .foo = SOURCE
69
69
myobj .foo = NONSOURCE
70
- SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-2 -> myobj.foo"
70
+ SINK_F (myobj .foo )
71
71
72
72
73
73
def test_direct_if_assign (cond = False ):
74
74
myobj = MyObj (NONSOURCE )
75
75
myobj .foo = SOURCE
76
76
if cond :
77
77
myobj .foo = NONSOURCE
78
- SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
78
+ SINK_F (myobj .foo )
79
79
SINK (myobj .foo ) # $ flow="SOURCE, l:-4 -> myobj.foo"
80
80
81
81
@@ -85,11 +85,11 @@ def test_direct_if_always_assign(cond = True):
85
85
myobj .foo = SOURCE
86
86
if cond :
87
87
myobj .foo = NONSOURCE
88
- SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
88
+ SINK_F (myobj .foo )
89
89
else :
90
90
myobj .foo = NONSOURCE
91
- SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-6 -> myobj.foo"
92
- SINK_F (myobj .foo ) # $ SPURIOUS: flow="SOURCE, l:-7 -> myobj.foo"
91
+ SINK_F (myobj .foo )
92
+ SINK_F (myobj .foo )
93
93
94
94
95
95
def test_getattr ():
You can’t perform that action at this time.
0 commit comments