Skip to content

Commit 51bc6dc

Browse files
committed
Python: Add attributeClearStep
1 parent d2b72a7 commit 51bc6dc

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,18 @@ predicate clearsContent(Node n, Content c) {
19731973
kwOverflowClearStep(n, c)
19741974
or
19751975
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))
19761988
}
19771989

19781990
//--------

python/ql/test/experimental/dataflow/fieldflow/test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ def test_direct_assign_overwrite():
6767
myobj = MyObj(NONSOURCE)
6868
myobj.foo = SOURCE
6969
myobj.foo = NONSOURCE
70-
SINK_F(myobj.foo) # $ SPURIOUS: flow="SOURCE, l:-2 -> myobj.foo"
70+
SINK_F(myobj.foo)
7171

7272

7373
def test_direct_if_assign(cond = False):
7474
myobj = MyObj(NONSOURCE)
7575
myobj.foo = SOURCE
7676
if cond:
7777
myobj.foo = NONSOURCE
78-
SINK_F(myobj.foo) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
78+
SINK_F(myobj.foo)
7979
SINK(myobj.foo) # $ flow="SOURCE, l:-4 -> myobj.foo"
8080

8181

@@ -85,11 +85,11 @@ def test_direct_if_always_assign(cond = True):
8585
myobj.foo = SOURCE
8686
if cond:
8787
myobj.foo = NONSOURCE
88-
SINK_F(myobj.foo) # $ SPURIOUS: flow="SOURCE, l:-3 -> myobj.foo"
88+
SINK_F(myobj.foo)
8989
else:
9090
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)
9393

9494

9595
def test_getattr():

0 commit comments

Comments
 (0)