Skip to content

Commit 142479e

Browse files
committed
Dataflow: Duplicate type info for AccessPath tails.
1 parent 69202d2 commit 142479e

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,19 +2813,19 @@ module Impl<FullStateConfigSig Config> {
28132813

28142814
private newtype TAccessPath =
28152815
TAccessPathNil(DataFlowType t) or
2816-
TAccessPathCons(TypedContent head, AccessPath tail) {
2816+
TAccessPathCons(TypedContent head, DataFlowType t, AccessPath tail) {
28172817
exists(AccessPathApproxCons apa |
28182818
not evalUnfold(apa, false) and
28192819
head = apa.getHead() and
2820-
hasTail(apa, _, tail.getApprox())
2820+
hasTail(apa, t, tail.getApprox())
28212821
)
28222822
} or
2823-
TAccessPathCons2(TypedContent head1, TypedContent head2, int len) {
2823+
TAccessPathCons2(TypedContent head1, DataFlowType t, TypedContent head2, int len) {
28242824
exists(AccessPathApproxCons apa, AccessPathApprox tail |
28252825
evalUnfold(apa, false) and
28262826
not expensiveLen1to2unfolding(apa) and
28272827
apa.len() = len and
2828-
hasTail(apa, _, tail) and
2828+
hasTail(apa, t, tail) and
28292829
head1 = apa.getHead() and
28302830
head2 = tail.getHead()
28312831
)
@@ -2925,9 +2925,10 @@ module Impl<FullStateConfigSig Config> {
29252925

29262926
private class AccessPathCons extends AccessPath, TAccessPathCons {
29272927
private TypedContent head;
2928+
private DataFlowType t;
29282929
private AccessPath tail;
29292930

2930-
AccessPathCons() { this = TAccessPathCons(head, tail) }
2931+
AccessPathCons() { this = TAccessPathCons(head, t, tail) }
29312932

29322933
override TypedContent getHead() { result = head }
29332934

@@ -2937,7 +2938,7 @@ module Impl<FullStateConfigSig Config> {
29372938

29382939
pragma[assume_small_delta]
29392940
override AccessPathApproxCons getApprox() {
2940-
result = TConsNil(head, tail.(AccessPathNil).getType())
2941+
result = TConsNil(head, t) and tail instanceof AccessPathNil
29412942
or
29422943
result = TConsCons(head, tail.getHead(), this.length())
29432944
or
@@ -2948,15 +2949,13 @@ module Impl<FullStateConfigSig Config> {
29482949
override int length() { result = 1 + tail.length() }
29492950

29502951
private string toStringImpl(boolean needsSuffix) {
2951-
exists(DataFlowType t |
2952-
tail = TAccessPathNil(t) and
2953-
needsSuffix = false and
2954-
result = head.toString() + "]" + concat(" : " + ppReprType(t))
2955-
)
2952+
tail = TAccessPathNil(_) and
2953+
needsSuffix = false and
2954+
result = head.toString() + "]" + concat(" : " + ppReprType(t))
29562955
or
29572956
result = head + ", " + tail.(AccessPathCons).toStringImpl(needsSuffix)
29582957
or
2959-
exists(TypedContent tc2, TypedContent tc3, int len | tail = TAccessPathCons2(tc2, tc3, len) |
2958+
exists(TypedContent tc2, TypedContent tc3, int len | tail = TAccessPathCons2(tc2, _, tc3, len) |
29602959
result = head + ", " + tc2 + ", " + tc3 + ", ... (" and len > 2 and needsSuffix = true
29612960
or
29622961
result = head + ", " + tc2 + ", " + tc3 + "]" and len = 2 and needsSuffix = false
@@ -2978,15 +2977,16 @@ module Impl<FullStateConfigSig Config> {
29782977

29792978
private class AccessPathCons2 extends AccessPath, TAccessPathCons2 {
29802979
private TypedContent head1;
2980+
private DataFlowType t;
29812981
private TypedContent head2;
29822982
private int len;
29832983

2984-
AccessPathCons2() { this = TAccessPathCons2(head1, head2, len) }
2984+
AccessPathCons2() { this = TAccessPathCons2(head1, t, head2, len) }
29852985

29862986
override TypedContent getHead() { result = head1 }
29872987

29882988
override AccessPath getTail() {
2989-
Stage5::consCand(head1, head2.getContainerType(), result.getApprox()) and
2989+
Stage5::consCand(head1, t, result.getApprox()) and
29902990
result.getHead() = head2 and
29912991
result.length() = len - 1
29922992
}

0 commit comments

Comments
 (0)