diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll index 4473adccb58f..1cc919ef6fe0 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll @@ -150,8 +150,11 @@ predicate readStep(Node node1, Content f, Node node2) { * in `x.f = newValue`. */ predicate clearsContent(Node n, Content c) { - c instanceof FieldContent and - n = any(PostUpdateNode pun | storeStep(_, c, pun)).getPreUpdateNode() + exists(FieldAccess fa | + instanceFieldAssign(_, fa) and + n = getFieldQualifier(fa) and + c.(FieldContent).getField() = fa.getField() + ) or FlowSummaryImpl::Private::Steps::summaryClearsContent(n, c) } diff --git a/java/ql/test/library-tests/dataflow/callback-dispatch/A.java b/java/ql/test/library-tests/dataflow/callback-dispatch/A.java index 087a93b0c4e1..790a1dd32e5b 100644 --- a/java/ql/test/library-tests/dataflow/callback-dispatch/A.java +++ b/java/ql/test/library-tests/dataflow/callback-dispatch/A.java @@ -174,7 +174,7 @@ void foo3() { a1.field1 = source(20); A a2 = new A(); applyConsumer1Field1Field2(a1, a2, p -> { - sink(p); // MISSING FLOW + sink(p); // $ flow=20 }); wrapSinkToAvoidFieldSsa(a1); sink(a2.field2);