Skip to content

Commit 3f38ac6

Browse files
committed
Data flow: Track access path singleton info
1 parent c1b19fb commit 3f38ac6

2 files changed

Lines changed: 39 additions & 18 deletions

File tree

shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,7 +2859,10 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
28592859
Typ getTyp(Type t) { any() }
28602860

28612861
bindingset[c, tail]
2862-
Ap apCons(Content c, Ap tail) { result.getAHead() = c and exists(tail) }
2862+
Ap apCons(Content c, Ap tail) {
2863+
result.getAHead() = c and
2864+
if result.isSingleton() then tail instanceof ApNil else not tail instanceof ApNil
2865+
}
28632866

28642867
class ApHeadContent = ContentApprox;
28652868

@@ -2961,7 +2964,10 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
29612964
Typ getTyp(Type t) { any() }
29622965

29632966
bindingset[c, tail]
2964-
Ap apCons(Content c, Ap tail) { result.getHead() = c and exists(tail) }
2967+
Ap apCons(Content c, Ap tail) {
2968+
result.getHead() = c and
2969+
if result.isSingleton() then tail instanceof ApNil else not tail instanceof ApNil
2970+
}
29652971

29662972
class ApHeadContent = Content;
29672973

@@ -3077,7 +3083,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
30773083
not expensiveLen2unfolding(c)
30783084
} or
30793085
TConsCons(Content c1, Content c2, int len) {
3080-
Stage4::consCand(c1, TFrontHead(c2)) and
3086+
Stage4::consCand(c1, TFrontHead(c2, _)) and
30813087
len in [2 .. Config::accessPathLimit()] and
30823088
not expensiveLen2unfolding(c1)
30833089
} or
@@ -3131,7 +3137,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
31313137

31323138
override int len() { result = 1 }
31333139

3134-
override AccessPathFront getFront() { result = TFrontHead(c) }
3140+
override AccessPathFront getFront() { result = TFrontHead(c, true) }
31353141

31363142
override predicate isCons(Content head, AccessPathApprox tail) { head = c and tail = TNil() }
31373143
}
@@ -3153,7 +3159,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
31533159

31543160
override int len() { result = len }
31553161

3156-
override AccessPathFront getFront() { result = TFrontHead(c1) }
3162+
override AccessPathFront getFront() { result = TFrontHead(c1, false) }
31573163

31583164
override predicate isCons(Content head, AccessPathApprox tail) {
31593165
head = c1 and
@@ -3184,12 +3190,14 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
31843190

31853191
override int len() { result = len }
31863192

3187-
override AccessPathFront getFront() { result = TFrontHead(c) }
3193+
override AccessPathFront getFront() {
3194+
if len = 1 then result = TFrontHead(c, true) else result = TFrontHead(c, false)
3195+
}
31883196

31893197
override predicate isCons(Content head, AccessPathApprox tail) {
31903198
head = c and
31913199
(
3192-
exists(Content c2 | Stage4::consCand(c, TFrontHead(c2)) |
3200+
exists(Content c2 | Stage4::consCand(c, TFrontHead(c2, _)) |
31933201
tail = TConsCons(c2, _, len - 1)
31943202
or
31953203
len = 2 and
@@ -3531,7 +3539,11 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
35313539

35323540
override predicate isCons(Content head, AccessPath tail) { head = head_ and tail = tail_ }
35333541

3534-
override AccessPathFrontHead getFront() { result = TFrontHead(head_) }
3542+
override AccessPathFrontHead getFront() {
3543+
if tail_.length() = 0
3544+
then result = TFrontHead(head_, true)
3545+
else result = TFrontHead(head_, false)
3546+
}
35353547

35363548
override AccessPathApproxCons getApprox() {
35373549
result = TConsNil(head_) and tail_ = TAccessPathNil()
@@ -3586,7 +3598,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
35863598
tail.length() = len - 1
35873599
}
35883600

3589-
override AccessPathFrontHead getFront() { result = TFrontHead(head1) }
3601+
override AccessPathFrontHead getFront() { result = TFrontHead(head1, false) }
35903602

35913603
override AccessPathApproxCons getApprox() {
35923604
result = TConsCons(head1, head2, len) or
@@ -3618,7 +3630,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
36183630
tail.length() = len - 1
36193631
}
36203632

3621-
override AccessPathFrontHead getFront() { result = TFrontHead(head_) }
3633+
override AccessPathFrontHead getFront() {
3634+
if len = 1 then result = TFrontHead(head_, true) else result = TFrontHead(head_, false)
3635+
}
36223636

36233637
override AccessPathApproxCons getApprox() { result = TCons1(head_, len) }
36243638

shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,12 +1797,12 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
17971797
cached
17981798
newtype TAccessPathFront =
17991799
TFrontNil() or
1800-
TFrontHead(Content c)
1800+
TFrontHead(Content c, Boolean singleton)
18011801

18021802
cached
18031803
newtype TApproxAccessPathFront =
18041804
TApproxFrontNil() or
1805-
TApproxFrontHead(ContentApprox c)
1805+
TApproxFrontHead(ContentApprox c, Boolean singleton)
18061806

18071807
cached
18081808
newtype TAccessPathFrontOption =
@@ -2505,12 +2505,14 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
25052505

25062506
abstract boolean toBoolNonEmpty();
25072507

2508-
ContentApprox getHead() { this = TApproxFrontHead(result) }
2508+
ContentApprox getHead() { this = TApproxFrontHead(result, _) }
2509+
2510+
predicate isSingleton() { this = TApproxFrontHead(_, true) }
25092511

25102512
pragma[nomagic]
25112513
Content getAHead() {
25122514
exists(ContentApprox cont |
2513-
this = TApproxFrontHead(cont) and
2515+
this = TApproxFrontHead(cont, _) and
25142516
cont = getContentApproxCached(result)
25152517
)
25162518
}
@@ -2525,7 +2527,7 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
25252527
class ApproxAccessPathFrontHead extends ApproxAccessPathFront, TApproxFrontHead {
25262528
private ContentApprox c;
25272529

2528-
ApproxAccessPathFrontHead() { this = TApproxFrontHead(c) }
2530+
ApproxAccessPathFrontHead() { this = TApproxFrontHead(c, _) }
25292531

25302532
override string toString() { result = c.toString() }
25312533

@@ -2549,7 +2551,9 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
25492551

25502552
abstract ApproxAccessPathFront toApprox();
25512553

2552-
Content getHead() { this = TFrontHead(result) }
2554+
Content getHead() { this = TFrontHead(result, _) }
2555+
2556+
predicate isSingleton() { this = TFrontHead(_, true) }
25532557
}
25542558

25552559
class AccessPathFrontNil extends AccessPathFront, TFrontNil {
@@ -2560,12 +2564,15 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
25602564

25612565
class AccessPathFrontHead extends AccessPathFront, TFrontHead {
25622566
private Content c;
2567+
private boolean singleton;
25632568

2564-
AccessPathFrontHead() { this = TFrontHead(c) }
2569+
AccessPathFrontHead() { this = TFrontHead(c, singleton) }
25652570

25662571
override string toString() { result = c.toString() }
25672572

2568-
override ApproxAccessPathFront toApprox() { result.getAHead() = c }
2573+
override ApproxAccessPathFront toApprox() {
2574+
result.getAHead() = c and result = TApproxFrontHead(_, singleton)
2575+
}
25692576
}
25702577

25712578
/** An optional access path front. */

0 commit comments

Comments
 (0)