Skip to content

Commit d7e61d0

Browse files
committed
Java: Update some model generator test cases.
1 parent d2c98c8 commit d7e61d0

File tree

5 files changed

+85
-22
lines changed

5 files changed

+85
-22
lines changed

java/ql/test/utils/modelgenerator/dataflow/p/InnerHolder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ public void append(String value) {
3737
}
3838

3939
// summary=p;InnerHolder;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
40-
// contentbased-summary=p;InnerHolder;false;getValue;();;Argument[this].SyntheticField[p.InnerHolder.context].SyntheticField[p.InnerHolder$Context.value];ReturnValue;value;df-generated
40+
// contentbased-summary=p;InnerHolder;false;getValue;();;Argument[this].SyntheticField[p.InnerHolder.sb];ReturnValue;taint;df-generated
4141
public String getValue() {
42+
return sb.toString();
43+
}
44+
45+
// summary=p;InnerHolder;false;getContextValue;();;Argument[this];ReturnValue;taint;df-generated
46+
// contentbased-summary=p;InnerHolder;false;getContextValue;();;Argument[this].SyntheticField[p.InnerHolder.context].SyntheticField[p.InnerHolder$Context.value];ReturnValue;value;df-generated
47+
public String getContextValue() {
4248
return context.getValue();
4349
}
4450
}

java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ public Joiner(CharSequence delimiter) {
2222
// summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[1];Argument[this];taint;df-generated
2323
// summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[2];Argument[this];taint;df-generated
2424
// contentbased-summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[0];Argument[this].SyntheticField[p.Joiner.delimiter];taint;df-generated
25-
// contentbased-summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[1];Argument[this].SyntheticField[p.Joiner.prefix];taint;df-generated
26-
// contentbased-summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[2];Argument[this].SyntheticField[p.Joiner.suffix];taint;df-generated
25+
// No content based summaries for prefix and suffix as they are "dead" synthetic fields.
2726
public Joiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
2827
Objects.requireNonNull(prefix, "The prefix must not be null");
2928
Objects.requireNonNull(delimiter, "The delimiter must not be null");
@@ -36,15 +35,20 @@ public Joiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
3635

3736
// summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this];taint;df-generated
3837
// summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated
39-
// contentbased-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this].SyntheticField[p.Joiner.emptyValue];taint;df-generated
40-
// contentbased-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];ReturnValue.SyntheticField[p.Joiner.emptyValue];taint;df-generated
38+
// No content based summary as emptyValue is "dead" (synthetic)field.
4139
// contentbased-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated
4240
public Joiner setEmptyValue(CharSequence emptyValue) {
4341
this.emptyValue =
4442
Objects.requireNonNull(emptyValue, "The empty value must not be null").toString();
4543
return this;
4644
}
4745

46+
// summary=p;Joiner;false;getDelimiter;();;Argument[this];ReturnValue;taint;df-generated
47+
// contentbased-summary=p;Joiner;false;getDelimiter;();;Argument[this].SyntheticField[p.Joiner.delimiter];ReturnValue;value;df-generated
48+
public String getDelimiter() {
49+
return delimiter;
50+
}
51+
4852
private static int getChars(String s, char[] chars, int start) {
4953
int len = s.length();
5054
s.getChars(0, len, chars, start);
@@ -78,8 +82,8 @@ public String toString() {
7882
}
7983

8084
// summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;df-generated
81-
// contentbased-summary=p;Joiner;false;add;(CharSequence);;Argument[this].SyntheticField[p.Joiner.elts].ArrayElement;ReturnValue.SyntheticField[p.Joiner.elts].ArrayElement;value;df-generated
8285
// contentbased-summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;df-generated
86+
// MISSING content based summaries for "elts". This could be a synthetic field.
8387
public Joiner add(CharSequence newElement) {
8488
final String elt = String.valueOf(newElement);
8589
if (elts == null) {
@@ -103,8 +107,8 @@ private int checkAddLength(int oldLen, int inc) {
103107
}
104108

105109
// summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated
106-
// contentbased-summary=p;Joiner;false;merge;(Joiner);;Argument[this].SyntheticField[p.Joiner.elts].ArrayElement;ReturnValue.SyntheticField[p.Joiner.elts].ArrayElement;value;df-generated
107110
// contentbased-summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated
111+
// MISSING content based summaries for "elts". This could be a synthetic field.
108112
public Joiner merge(Joiner other) {
109113
Objects.requireNonNull(other);
110114
if (other.elts == null) {

java/ql/test/utils/modelgenerator/dataflow/p/MultipleImpls.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,16 @@ public static class Strat2 implements Strategy {
3030
private String foo;
3131

3232
// summary=p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];Argument[this];taint;df-generated
33-
// A field based model should not be lifted if the field pertains to the concrete
34-
// implementation.
35-
// SPURIOUS-contentbased-summary=p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];Argument[this].SyntheticField[p.MultipleImpls$Strat2.foo];value;df-generated
33+
// The content based summary is not lifted as it pertains to a (synthetic)field.
34+
// contentbased-summary=p;MultipleImpls$Strat2;true;doSomething;(String);;Argument[0];Argument[this].SyntheticField[p.MultipleImpls$Strat2.foo];value;df-generated
3635
public String doSomething(String value) {
3736
this.foo = value;
3837
return "none";
3938
}
4039

4140
// summary=p;MultipleImpls$Strat2;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
42-
// A field based model should not be lifted if the field pertains to the concrete
43-
// implementation.
44-
// SPURIOUS-contentbased-summary=p;MultipleImpls$Strat2;true;getValue;();;Argument[this].SyntheticField[p.MultipleImpls$Strat2.foo];ReturnValue;value;df-generated
41+
// The content based summary is not lifted as it pertains to a (synthetic)field.
42+
// contentbased-summary=p;MultipleImpls$Strat2;true;getValue;();;Argument[this].SyntheticField[p.MultipleImpls$Strat2.foo];ReturnValue;value;df-generated
4543
public String getValue() {
4644
return this.foo;
4745
}

java/ql/test/utils/modelgenerator/dataflow/p/Pojo.java

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,20 @@ int length() {
2626

2727
public byte[] byteArray = new byte[] {1, 2, 3};
2828
private float[] floatArray = new float[] {1, 2, 3};
29-
private char[] charArray = new char[] {'a', 'b', 'c'};
3029
private List<Character> charList = Arrays.asList('a', 'b', 'c');
31-
private Byte[] byteObjectArray = new Byte[] {1, 2, 3};
30+
private char[] charArray;
31+
private Byte[] byteObjectArray;
32+
private String stringValue1;
33+
private String stringValue2;
34+
35+
// summary=p;Pojo;false;Pojo;(Byte[],char[]);;Argument[0];Argument[this];taint;df-generated
36+
// summary=p;Pojo;false;Pojo;(Byte[],char[]);;Argument[1];Argument[this];taint;df-generated
37+
// contentbased-summary=p;Pojo;false;Pojo;(Byte[],char[]);;Argument[0];Argument[this].SyntheticField[p.Pojo.byteObjectArray];value;df-generated
38+
// contentbased-summary=p;Pojo;false;Pojo;(Byte[],char[]);;Argument[1];Argument[this].SyntheticField[p.Pojo.charArray];value;df-generated
39+
public Pojo(Byte[] byteObjectArray, char[] charArray) {
40+
this.byteObjectArray = byteObjectArray;
41+
this.charArray = charArray;
42+
}
3243

3344
// summary=p;Pojo;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
3445
// contentbased-summary=p;Pojo;false;getValue;();;Argument[this].SyntheticField[p.Pojo.value];ReturnValue;value;df-generated
@@ -75,6 +86,12 @@ public byte[] getByteArray() {
7586
return byteArray;
7687
}
7788

89+
// summary=p;Pojo;false;setByteArray;(byte[]);;Argument[0];Argument[this];taint;df-generated
90+
// contentbased-summary=p;Pojo;false;setByteArray;(byte[]);;Argument[0];Argument[this].Field[p.Pojo.byteArray];value;df-generated
91+
public void setByteArray(byte[] value) {
92+
byteArray = value;
93+
}
94+
7895
// neutral=p;Pojo;getFloatArray;();summary;df-generated
7996
public float[] getFloatArray() {
8097
return floatArray;
@@ -91,7 +108,7 @@ public Collection<Integer> getBoxedCollection() {
91108
}
92109

93110
// summary=p;Pojo;false;getBoxedChars;();;Argument[this];ReturnValue;taint;df-generated
94-
// contentbased-summary=p;Pojo;false;getBoxedChars;();;Argument[this].SyntheticField[p.Pojo.charList];ReturnValue;value;df-generated
111+
// No content based summary as charList is a "dead" (synthetic)field.
95112
public List<Character> getBoxedChars() {
96113
return charList;
97114
}
@@ -117,4 +134,44 @@ public BigDecimal getBigDecimal() {
117134
public void fillIn(List<String> target) {
118135
target.add(value);
119136
}
137+
138+
// summary=p;Pojo;false;setStringValue1;(String);;Argument[0];Argument[this];taint;df-generated
139+
// contentbased-summary=p;Pojo;false;setStringValue1;(String);;Argument[0];Argument[this].SyntheticField[p.Pojo.stringValue1];value;df-generated
140+
public void setStringValue1(String value) {
141+
this.stringValue1 = value;
142+
}
143+
144+
// neutral=p;Pojo;copyStringValue;();summary;df-generated
145+
// contentbased-summary=p;Pojo;false;copyStringValue;();;Argument[this].SyntheticField[p.Pojo.stringValue1];Argument[this].SyntheticField[p.Pojo.stringValue2];value;df-generated
146+
public void copyStringValue() {
147+
this.stringValue2 = this.stringValue1;
148+
}
149+
150+
// summary=p;Pojo;false;getStringValue2;();;Argument[this];ReturnValue;taint;df-generated
151+
// contentbased-summary=p;Pojo;false;getStringValue2;();;Argument[this].SyntheticField[p.Pojo.stringValue2];ReturnValue;value;df-generated
152+
public String getStringValue2() {
153+
return this.stringValue2;
154+
}
155+
156+
public class InnerPojo {
157+
private String value;
158+
159+
// summary=p;Pojo$InnerPojo;true;InnerPojo;(String);;Argument[0];Argument[this];taint;df-generated
160+
// contentbased-summary=p;Pojo$InnerPojo;true;InnerPojo;(String);;Argument[0];Argument[this].SyntheticField[p.Pojo$InnerPojo.value];value;df-generated
161+
public InnerPojo(String value) {
162+
this.value = value;
163+
}
164+
165+
// summary=p;Pojo$InnerPojo;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
166+
// contentbased-summary=p;Pojo$InnerPojo;true;getValue;();;Argument[this].SyntheticField[p.Pojo$InnerPojo.value];ReturnValue;value;df-generated
167+
public String getValue() {
168+
return value;
169+
}
170+
}
171+
172+
// summary=p;Pojo;false;makeInnerPojo;(String);;Argument[0];ReturnValue;taint;df-generated
173+
// contentbased-summary=p;Pojo;false;makeInnerPojo;(String);;Argument[0];ReturnValue.SyntheticField[p.Pojo$InnerPojo.value];value;df-generated
174+
public InnerPojo makeInnerPojo(String value) {
175+
return new InnerPojo(value);
176+
}
120177
}

java/ql/test/utils/modelgenerator/dataflow/p/PrivateFlowViaPublicInterface.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ public PrivateImplWithSink(File file) {
2929
}
3030

3131
// summary=p;PrivateFlowViaPublicInterface$SPI;true;openStream;();;Argument[this];ReturnValue;taint;df-generated
32-
// A field based model should not be lifted if the field pertains to the concrete
33-
// implementation.
34-
// SPURIOUS-contentbased-summary=p;PrivateFlowViaPublicInterface$SPI;true;openStream;();;Argument[this].SyntheticField[p.PrivateFlowViaPublicInterface$PrivateImplWithSink.file];ReturnValue;taint;df-generated
32+
// This summary shouldn't be created because the method is private.
33+
// This is most likely because the lifting logic hasn't been properly adapted.
34+
// SPURIOUS-contentbased-summary=p;PrivateFlowViaPublicInterface$PrivateImplWithSink;false;openStream;();;Argument[this].SyntheticField[p.PrivateFlowViaPublicInterface$PrivateImplWithSink.file];ReturnValue;taint;df-generated
3535
@Override
3636
public OutputStream openStream() throws IOException {
3737
return new FileOutputStream(file);
@@ -54,9 +54,7 @@ public OutputStream openStreamNone() throws IOException {
5454
}
5555

5656
// summary=p;PrivateFlowViaPublicInterface;true;createAnSPI;(File);;Argument[0];ReturnValue;taint;df-generated
57-
// A field based model should not be lifted if the field pertains to the concrete
58-
// implementation.
59-
// SPURIOUS-contentbased-summary=p;PrivateFlowViaPublicInterface;true;createAnSPI;(File);;Argument[0];ReturnValue.SyntheticField[p.PrivateFlowViaPublicInterface$PrivateImplWithSink.file];value;df-generated
57+
// contentbased-summary=p;PrivateFlowViaPublicInterface;true;createAnSPI;(File);;Argument[0];ReturnValue.SyntheticField[p.PrivateFlowViaPublicInterface$PrivateImplWithSink.file];value;df-generated
6058
public static SPI createAnSPI(File file) {
6159
return new PrivateImplWithSink(file);
6260
}

0 commit comments

Comments
 (0)