Skip to content
This repository was archived by the owner on Jan 5, 2023. It is now read-only.

Commit 650bc1d

Browse files
committed
Add PostUpdateNodes for derferenced expressions on an access path to a field- or element-write
1 parent 5068b8b commit 650bc1d

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed

ql/src/semmle/go/dataflow/internal/DataFlowUtil.qll

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -420,11 +420,14 @@ private Node getADirectlyWrittenNode() {
420420
exists(Write w | w.writesField(result, _, _) or w.writesElement(result, _, _))
421421
}
422422

423-
private Node getAWrittenNode() {
424-
result = getADirectlyWrittenNode() or
425-
result = getADirectlyWrittenNode().(ComponentReadNode).getBase+()
423+
private DataFlow::Node getAccessPathPredecessor(DataFlow::Node node) {
424+
result = node.(PointerDereferenceNode).getOperand()
425+
or
426+
result = node.(ComponentReadNode).getBase()
426427
}
427428

429+
private Node getAWrittenNode() { result = getAccessPathPredecessor*(getADirectlyWrittenNode()) }
430+
428431
/**
429432
* A node associated with an object after an operation that might have
430433
* changed its state.
@@ -448,11 +451,7 @@ class PostUpdateNode extends Node {
448451
or
449452
preupd = any(PointerDereferenceNode deref).getOperand()
450453
or
451-
exists(Node written | written = getAWrittenNode() |
452-
preupd = written
453-
or
454-
preupd = written.(PointerDereferenceNode).getOperand()
455-
)
454+
preupd = getAWrittenNode()
456455
or
457456
preupd instanceof ArgumentNode and
458457
mutableType(preupd.getType())
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
| test.go:19:2:19:2 | definition of a |
2+
| test.go:20:11:20:14 | &... |
3+
| test.go:20:12:20:14 | selection of b |
4+
| test.go:21:2:21:5 | selection of bs |
5+
| test.go:21:2:21:8 | index expression |
6+
| test.go:21:17:21:20 | &... |
7+
| test.go:21:18:21:20 | struct literal |
8+
| test.go:22:2:22:5 | selection of bs |
9+
| test.go:22:2:22:8 | index expression |
10+
| test.go:22:2:22:13 | implicit dereference |
11+
| test.go:22:2:22:13 | selection of cptr |
12+
| test.go:23:2:23:7 | implicit dereference |
13+
| test.go:23:2:23:7 | selection of bptr |
14+
| test.go:23:2:23:12 | implicit dereference |
15+
| test.go:23:2:23:12 | selection of cptr |
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package a
2+
3+
type C struct {
4+
field int
5+
}
6+
7+
type B struct {
8+
cptr *C
9+
}
10+
11+
type A struct {
12+
b B
13+
bptr *B
14+
bs [5]B
15+
}
16+
17+
func f() {
18+
19+
a := A{}
20+
a.bptr = &a.b
21+
a.bs[3].cptr = &C{}
22+
a.bs[3].cptr.field = 100
23+
a.bptr.cptr.field = 101
24+
25+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import go
2+
3+
from DataFlow::PostUpdateNode pun
4+
select pun

0 commit comments

Comments
 (0)