Skip to content

Commit 4348e9e

Browse files
committed
Java: Change the heuristic summary test tag to heuristic-summary.
1 parent 730df41 commit 4348e9e

22 files changed

+198
-198
lines changed

java/ql/test/utils/modelgenerator/dataflow/CaptureHeuristicSummaryModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import utils.test.InlineMadTest
55
module InlineMadTestConfig implements InlineMadTestConfigSig {
66
string getCapturedModel(Callable c) { result = Heuristic::captureFlow(c) }
77

8-
string getKind() { result = "summary" }
8+
string getKind() { result = "heuristic-summary" }
99
}
1010

1111
import InlineMadTest<InlineMadTestConfig>

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ public final class Factory {
66

77
private int intValue;
88

9-
// summary=p;Factory;false;create;(String,int);;Argument[0];ReturnValue;taint;df-generated
9+
// heuristic-summary=p;Factory;false;create;(String,int);;Argument[0];ReturnValue;taint;df-generated
1010
// contentbased-summary=p;Factory;false;create;(String,int);;Argument[0];ReturnValue.Field[p.Factory.value];value;dfc-generated
1111
public static Factory create(String value, int foo) {
1212
return new Factory(value, foo);
1313
}
1414

15-
// summary=p;Factory;false;create;(String);;Argument[0];ReturnValue;taint;df-generated
15+
// heuristic-summary=p;Factory;false;create;(String);;Argument[0];ReturnValue;taint;df-generated
1616
// contentbased-summary=p;Factory;false;create;(String);;Argument[0];ReturnValue.Field[p.Factory.value];value;dfc-generated
1717
public static Factory create(String value) {
1818
return new Factory(value, 0);
@@ -23,7 +23,7 @@ private Factory(String value, int intValue) {
2323
this.intValue = intValue;
2424
}
2525

26-
// summary=p;Factory;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
26+
// heuristic-summary=p;Factory;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
2727
// contentbased-summary=p;Factory;false;getValue;();;Argument[this].Field[p.Factory.value];ReturnValue;value;dfc-generated
2828
public String getValue() {
2929
return value;

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public interface I2 extends I1 {}
1010
public class Impl1 implements I1 {
1111
public String v;
1212

13-
// summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
13+
// heuristic-summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
1414
// contentbased-summary=p;Fanout$Impl1;true;getValue;();;Argument[this].Field[p.Fanout$Impl1.v];ReturnValue;value;dfc-generated
1515
public String getValue() {
1616
return v;
@@ -20,7 +20,7 @@ public String getValue() {
2020
public class Impl2 implements I2 {
2121
public String v;
2222

23-
// summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
23+
// heuristic-summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
2424
// contentbased-summary=p;Fanout$Impl2;true;getValue;();;Argument[this].Field[p.Fanout$Impl2.v];ReturnValue;value;dfc-generated
2525
public String getValue() {
2626
return v;
@@ -30,7 +30,7 @@ public String getValue() {
3030
public class Impl3 implements I2 {
3131
public String v;
3232

33-
// summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
33+
// heuristic-summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
3434
// contentbased-summary=p;Fanout$Impl3;true;getValue;();;Argument[this].Field[p.Fanout$Impl3.v];ReturnValue;value;dfc-generated
3535
public String getValue() {
3636
return v;
@@ -40,24 +40,24 @@ public String getValue() {
4040
public class Impl4 implements I2 {
4141
public String v;
4242

43-
// summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
43+
// heuristic-summary=p;Fanout$I1;true;getValue;();;Argument[this];ReturnValue;taint;df-generated
4444
// contentbased-summary=p;Fanout$Impl4;true;getValue;();;Argument[this].Field[p.Fanout$Impl4.v];ReturnValue;value;dfc-generated
4545
public String getValue() {
4646
return v;
4747
}
4848
}
4949

50-
// summary=p;Fanout;true;concatGetValueOnI1;(String,Fanout$I1);;Argument[0];ReturnValue;taint;df-generated
51-
// summary=p;Fanout;true;concatGetValueOnI1;(String,Fanout$I1);;Argument[1];ReturnValue;taint;df-generated
50+
// heuristic-summary=p;Fanout;true;concatGetValueOnI1;(String,Fanout$I1);;Argument[0];ReturnValue;taint;df-generated
51+
// heuristic-summary=p;Fanout;true;concatGetValueOnI1;(String,Fanout$I1);;Argument[1];ReturnValue;taint;df-generated
5252
// No content based summaries are expected for this method on parameter `i`
5353
// as the fanout (number of content flows) exceeds the limit of 3.
5454
// contentbased-summary=p;Fanout;true;concatGetValueOnI1;(String,Fanout$I1);;Argument[0];ReturnValue;taint;dfc-generated
5555
public String concatGetValueOnI1(String other, I1 i) {
5656
return other + i.getValue();
5757
}
5858

59-
// summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[0];ReturnValue;taint;df-generated
60-
// summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[1];ReturnValue;taint;df-generated
59+
// heuristic-summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[0];ReturnValue;taint;df-generated
60+
// heuristic-summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[1];ReturnValue;taint;df-generated
6161
// contentbased-summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[0];ReturnValue;taint;dfc-generated
6262
// contentbased-summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[1].Field[p.Fanout$Impl2.v];ReturnValue;taint;dfc-generated
6363
// contentbased-summary=p;Fanout;true;concatGetValueOnI2;(String,Fanout$I2);;Argument[1].Field[p.Fanout$Impl3.v];ReturnValue;taint;dfc-generated

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public final class FinalClass {
44

55
private static final String C = "constant";
66

7-
// summary=p;FinalClass;false;returnsInput;(String);;Argument[0];ReturnValue;taint;df-generated
7+
// heuristic-summary=p;FinalClass;false;returnsInput;(String);;Argument[0];ReturnValue;taint;df-generated
88
// contentbased-summary=p;FinalClass;false;returnsInput;(String);;Argument[0];ReturnValue;value;dfc-generated
99
public String returnsInput(String input) {
1010
return input;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
public final class FluentAPI {
44

5-
// summary=p;FluentAPI;false;returnsThis;(String);;Argument[this];ReturnValue;value;df-generated
5+
// heuristic-summary=p;FluentAPI;false;returnsThis;(String);;Argument[this];ReturnValue;value;df-generated
66
// contentbased-summary=p;FluentAPI;false;returnsThis;(String);;Argument[this];ReturnValue;value;dfc-generated
77
public FluentAPI returnsThis(String input) {
88
return this;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ public final class ImmutablePojo {
66

77
private final long x;
88

9-
// summary=p;ImmutablePojo;false;ImmutablePojo;(String,int);;Argument[0];Argument[this];taint;df-generated
9+
// heuristic-summary=p;ImmutablePojo;false;ImmutablePojo;(String,int);;Argument[0];Argument[this];taint;df-generated
1010
// contentbased-summary=p;ImmutablePojo;false;ImmutablePojo;(String,int);;Argument[0];Argument[this].SyntheticField[p.ImmutablePojo.value];value;dfc-generated
1111
public ImmutablePojo(String value, int x) {
1212
this.value = value;
1313
this.x = x;
1414
}
1515

16-
// summary=p;ImmutablePojo;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
16+
// heuristic-summary=p;ImmutablePojo;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
1717
// contentbased-summary=p;ImmutablePojo;false;getValue;();;Argument[this].SyntheticField[p.ImmutablePojo.value];ReturnValue;value;dfc-generated
1818
public String getValue() {
1919
return value;
@@ -24,8 +24,8 @@ public long getX() {
2424
return x;
2525
}
2626

27-
// summary=p;ImmutablePojo;false;or;(String);;Argument[0];ReturnValue;taint;df-generated
28-
// summary=p;ImmutablePojo;false;or;(String);;Argument[this];ReturnValue;taint;df-generated
27+
// heuristic-summary=p;ImmutablePojo;false;or;(String);;Argument[0];ReturnValue;taint;df-generated
28+
// heuristic-summary=p;ImmutablePojo;false;or;(String);;Argument[this];ReturnValue;taint;df-generated
2929
// contentbased-summary=p;ImmutablePojo;false;or;(String);;Argument[0];ReturnValue;value;dfc-generated
3030
// contentbased-summary=p;ImmutablePojo;false;or;(String);;Argument[this].SyntheticField[p.ImmutablePojo.value];ReturnValue;value;dfc-generated
3131
public String or(String defaultValue) {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public abstract class BasePublic {
1010
}
1111

1212
public class AImplBasePrivateImpl extends BasePrivate {
13-
// summary=p;Inheritance$AImplBasePrivateImpl;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
13+
// heuristic-summary=p;Inheritance$AImplBasePrivateImpl;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
1414
// contentbased-summary=p;Inheritance$AImplBasePrivateImpl;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
1515
@Override
1616
public String id(String s) {
@@ -19,7 +19,7 @@ public String id(String s) {
1919
}
2020

2121
public class AImplBasePublic extends BasePublic {
22-
// summary=p;Inheritance$BasePublic;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
22+
// heuristic-summary=p;Inheritance$BasePublic;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
2323
// contentbased-summary=p;Inheritance$BasePublic;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
2424
@Override
2525
public String id(String s) {
@@ -60,7 +60,7 @@ private abstract class E implements IPrivate2 {
6060
}
6161

6262
public class BImpl extends B {
63-
// summary=p;Inheritance$IPublic1;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
63+
// heuristic-summary=p;Inheritance$IPublic1;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
6464
// contentbased-summary=p;Inheritance$IPublic1;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
6565
@Override
6666
public String id(String s) {
@@ -69,7 +69,7 @@ public String id(String s) {
6969
}
7070

7171
public class CImpl extends C {
72-
// summary=p;Inheritance$C;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
72+
// heuristic-summary=p;Inheritance$C;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
7373
// contentbased-summary=p;Inheritance$C;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
7474
@Override
7575
public String id(String s) {
@@ -78,7 +78,7 @@ public String id(String s) {
7878
}
7979

8080
public class DImpl extends D {
81-
// summary=p;Inheritance$IPublic2;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
81+
// heuristic-summary=p;Inheritance$IPublic2;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
8282
// contentbased-summary=p;Inheritance$IPublic2;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
8383
@Override
8484
public String id(String s) {
@@ -87,7 +87,7 @@ public String id(String s) {
8787
}
8888

8989
public class EImpl extends E {
90-
// summary=p;Inheritance$EImpl;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
90+
// heuristic-summary=p;Inheritance$EImpl;true;id;(String);;Argument[0];ReturnValue;taint;df-generated
9191
// contentbased-summary=p;Inheritance$EImpl;true;id;(String);;Argument[0];ReturnValue;value;dfc-generated
9292
@Override
9393
public String id(String s) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ public String no(String input) {
99
}
1010

1111
public class CaptureMe {
12-
// summary=p;InnerClasses$CaptureMe;true;yesCm;(String);;Argument[0];ReturnValue;taint;df-generated
12+
// heuristic-summary=p;InnerClasses$CaptureMe;true;yesCm;(String);;Argument[0];ReturnValue;taint;df-generated
1313
// contentbased-summary=p;InnerClasses$CaptureMe;true;yesCm;(String);;Argument[0];ReturnValue;value;dfc-generated
1414
public String yesCm(String input) {
1515
return input;
1616
}
1717
}
1818

19-
// summary=p;InnerClasses;true;yes;(String);;Argument[0];ReturnValue;taint;df-generated
19+
// heuristic-summary=p;InnerClasses;true;yes;(String);;Argument[0];ReturnValue;taint;df-generated
2020
// contentbased-summary=p;InnerClasses;true;yes;(String);;Argument[0];ReturnValue;value;dfc-generated
2121
public String yes(String input) {
2222
return input;

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,31 @@ public String getValue() {
1818

1919
private StringBuilder sb = new StringBuilder();
2020

21-
// summary=p;InnerHolder;false;setContext;(String);;Argument[0];Argument[this];taint;df-generated
21+
// heuristic-summary=p;InnerHolder;false;setContext;(String);;Argument[0];Argument[this];taint;df-generated
2222
// contentbased-summary=p;InnerHolder;false;setContext;(String);;Argument[0];Argument[this].SyntheticField[p.InnerHolder.context].SyntheticField[p.InnerHolder$Context.value];value;dfc-generated
2323
public void setContext(String value) {
2424
context = new Context(value);
2525
}
2626

27-
// summary=p;InnerHolder;false;explicitSetContext;(String);;Argument[0];Argument[this];taint;df-generated
27+
// heuristic-summary=p;InnerHolder;false;explicitSetContext;(String);;Argument[0];Argument[this];taint;df-generated
2828
// contentbased-summary=p;InnerHolder;false;explicitSetContext;(String);;Argument[0];Argument[this].SyntheticField[p.InnerHolder.context].SyntheticField[p.InnerHolder$Context.value];value;dfc-generated
2929
public void explicitSetContext(String value) {
3030
this.context = new Context(value);
3131
}
3232

33-
// summary=p;InnerHolder;false;append;(String);;Argument[0];Argument[this];taint;df-generated
33+
// heuristic-summary=p;InnerHolder;false;append;(String);;Argument[0];Argument[this];taint;df-generated
3434
// contentbased-summary=p;InnerHolder;false;append;(String);;Argument[0];Argument[this].SyntheticField[p.InnerHolder.sb];taint;dfc-generated
3535
public void append(String value) {
3636
sb.append(value);
3737
}
3838

39-
// summary=p;InnerHolder;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
39+
// heuristic-summary=p;InnerHolder;false;getValue;();;Argument[this];ReturnValue;taint;df-generated
4040
// contentbased-summary=p;InnerHolder;false;getValue;();;Argument[this].SyntheticField[p.InnerHolder.sb];ReturnValue;taint;dfc-generated
4141
public String getValue() {
4242
return sb.toString();
4343
}
4444

45-
// summary=p;InnerHolder;false;getContextValue;();;Argument[this];ReturnValue;taint;df-generated
45+
// heuristic-summary=p;InnerHolder;false;getContextValue;();;Argument[this];ReturnValue;taint;df-generated
4646
// contentbased-summary=p;InnerHolder;false;getContextValue;();;Argument[this].SyntheticField[p.InnerHolder.context].SyntheticField[p.InnerHolder$Context.value];ReturnValue;value;dfc-generated
4747
public String getContextValue() {
4848
return context.getValue();

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ public final class Joiner {
1212
private int len;
1313
private String emptyValue;
1414

15-
// summary=p;Joiner;false;Joiner;(CharSequence);;Argument[0];Argument[this];taint;df-generated
15+
// heuristic-summary=p;Joiner;false;Joiner;(CharSequence);;Argument[0];Argument[this];taint;df-generated
1616
// contentbased-summary=p;Joiner;false;Joiner;(CharSequence);;Argument[0];Argument[this].SyntheticField[p.Joiner.delimiter];taint;dfc-generated
1717
public Joiner(CharSequence delimiter) {
1818
this(delimiter, "", "");
1919
}
2020

21-
// summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[0];Argument[this];taint;df-generated
22-
// summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[1];Argument[this];taint;df-generated
23-
// summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[2];Argument[this];taint;df-generated
21+
// heuristic-summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[0];Argument[this];taint;df-generated
22+
// heuristic-summary=p;Joiner;false;Joiner;(CharSequence,CharSequence,CharSequence);;Argument[1];Argument[this];taint;df-generated
23+
// heuristic-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;dfc-generated
2525
// No content based summaries for prefix and suffix as they are "dead" synthetic fields.
2626
public Joiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
@@ -33,8 +33,8 @@ public Joiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
3333
checkAddLength(0, 0);
3434
}
3535

36-
// summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this];taint;df-generated
37-
// summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated
36+
// heuristic-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this];taint;df-generated
37+
// heuristic-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated
3838
// No content based summary as emptyValue is "dead" (synthetic)field.
3939
// contentbased-summary=p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;dfc-generated
4040
public Joiner setEmptyValue(CharSequence emptyValue) {
@@ -43,7 +43,7 @@ public Joiner setEmptyValue(CharSequence emptyValue) {
4343
return this;
4444
}
4545

46-
// summary=p;Joiner;false;getDelimiter;();;Argument[this];ReturnValue;taint;df-generated
46+
// heuristic-summary=p;Joiner;false;getDelimiter;();;Argument[this];ReturnValue;taint;df-generated
4747
// contentbased-summary=p;Joiner;false;getDelimiter;();;Argument[this].SyntheticField[p.Joiner.delimiter];ReturnValue;value;dfc-generated
4848
public String getDelimiter() {
4949
return delimiter;
@@ -81,7 +81,7 @@ public String toString() {
8181
return new String(chars);
8282
}
8383

84-
// summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;df-generated
84+
// heuristic-summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;df-generated
8585
// contentbased-summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;dfc-generated
8686
// MISSING content based summaries for "elts". This could be a synthetic field.
8787
public Joiner add(CharSequence newElement) {
@@ -106,7 +106,7 @@ private int checkAddLength(int oldLen, int inc) {
106106
return (int) newLen;
107107
}
108108

109-
// summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated
109+
// heuristic-summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated
110110
// contentbased-summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;dfc-generated
111111
// MISSING content based summaries for "elts". This could be a synthetic field.
112112
public Joiner merge(Joiner other) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
public class MultiPaths {
44

5-
// summary=p;MultiPaths;true;cond;(String,String);;Argument[0];ReturnValue;taint;df-generated
5+
// heuristic-summary=p;MultiPaths;true;cond;(String,String);;Argument[0];ReturnValue;taint;df-generated
66
// contentbased-summary=p;MultiPaths;true;cond;(String,String);;Argument[0];ReturnValue;value;dfc-generated
77
public String cond(String x, String other) {
88
if (x == other) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public Object m(Object value) {
1616
}
1717

1818
public class Impl2 implements IInterface {
19-
// summary=p;MultipleImpl2$IInterface;true;m;(Object);;Argument[0];ReturnValue;taint;df-generated
19+
// heuristic-summary=p;MultipleImpl2$IInterface;true;m;(Object);;Argument[0];ReturnValue;taint;df-generated
2020
// contentbased-summary=p;MultipleImpl2$IInterface;true;m;(Object);;Argument[0];ReturnValue;value;dfc-generated
2121
public Object m(Object value) {
2222
return value;

0 commit comments

Comments
 (0)