Skip to content

Commit c01f570

Browse files
committed
Java: Implement clearsContent()
1 parent c057e82 commit c01f570

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

java/ql/src/semmle/code/java/dataflow/internal/DataFlowPrivate.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,15 @@ predicate readStep(Node node1, Content f, Node node2) {
195195
)
196196
}
197197

198+
/**
199+
* Holds if values stored inside content `c` are cleared at node `n`. For example,
200+
* any value stored inside `f` is cleared at the pre-update node associated with `x`
201+
* in `x.f = newValue`.
202+
*/
203+
predicate clearsContent(Node n, Content c) {
204+
n = any(PostUpdateNode pun | storeStep(_, c, pun)).getPreUpdateNode()
205+
}
206+
198207
/**
199208
* Gets a representative (boxed) type for `t` for the purpose of pruning
200209
* possible flow. A single type is used for all numeric types to account for

java/ql/test/library-tests/dataflow/fields/F.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ private void m() {
1313
f.Field2 = o;
1414
f.Field2 = null;
1515
sink(f.Field1); // flow
16-
sink(f.Field2); // no flow [FALSE POSITIVE]
16+
sink(f.Field2); // no flow
1717

1818
f = new F();
1919
f.Field2 = null;
2020
sink(f.Field1); // flow
21-
sink(f.Field2); // no flow [FALSE POSITIVE]
21+
sink(f.Field2); // no flow
2222

2323
f = new F();
2424
o = new Object();
@@ -31,7 +31,7 @@ private void m2(F f)
3131
{
3232
f.Field2 = null;
3333
sink(f.Field1); // flow
34-
sink(f.Field2); // no flow [FALSE POSITIVE]
34+
sink(f.Field2); // no flow
3535
}
3636

3737
public static void sink(Object o) { }

java/ql/test/library-tests/dataflow/fields/flow.expected

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@
2626
| E.java:2:32:2:43 | new Object(...) | E.java:21:10:21:24 | bh2.buf.content |
2727
| E.java:2:32:2:43 | new Object(...) | E.java:24:10:24:28 | p2.data.buf.content |
2828
| E.java:2:32:2:43 | new Object(...) | E.java:30:10:30:27 | p.data.buf.content |
29-
| F.java:5:14:5:25 | new Object(...) | F.java:15:10:15:17 | f.Field1 |
3029
| F.java:5:14:5:25 | new Object(...) | F.java:20:10:20:17 | f.Field1 |
31-
| F.java:5:14:5:25 | new Object(...) | F.java:33:10:33:17 | f.Field1 |
32-
| F.java:6:14:6:25 | new Object(...) | F.java:16:10:16:17 | f.Field2 |
33-
| F.java:6:14:6:25 | new Object(...) | F.java:21:10:21:17 | f.Field2 |
34-
| F.java:6:14:6:25 | new Object(...) | F.java:34:10:34:17 | f.Field2 |
3530
| F.java:10:16:10:27 | new Object(...) | F.java:15:10:15:17 | f.Field1 |
36-
| F.java:10:16:10:27 | new Object(...) | F.java:16:10:16:17 | f.Field2 |
3731
| F.java:24:9:24:20 | new Object(...) | F.java:33:10:33:17 | f.Field1 |
38-
| F.java:24:9:24:20 | new Object(...) | F.java:34:10:34:17 | f.Field2 |

0 commit comments

Comments
 (0)