Skip to content

Commit 3a6fa9d

Browse files
committed
Java: Add support for framework modelling through csv data.
1 parent 9930d59 commit 3a6fa9d

File tree

10 files changed

+670
-0
lines changed

10 files changed

+670
-0
lines changed

java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 419 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package my.qltest;
2+
3+
public class A {
4+
void foo() {
5+
Object x;
6+
x = src1();
7+
x = src1("");
8+
9+
Sub sub = new Sub();
10+
x = sub.src2();
11+
x = sub.src3();
12+
13+
srcArg(x);
14+
15+
Handler h = srcparam1 -> { };
16+
17+
Handler h2 = new Handler() {
18+
@Override public void handle(Object srcparam2) { }
19+
};
20+
21+
x = taggedSrcMethod();
22+
x = taggedSrcField;
23+
24+
x = srcTwoArg("", "");
25+
}
26+
27+
@Tag
28+
void tagged1(Object taggedMethodParam) {
29+
}
30+
31+
void tagged2(@Tag Object taggedSrcParam) {
32+
}
33+
34+
Object src1() { return null; }
35+
36+
Object src1(String s) { return null; }
37+
38+
Object src2() { return null; }
39+
40+
Object src3() { return null; }
41+
42+
static class Sub extends A {
43+
// inherit src2
44+
@Override Object src3() { return null; }
45+
}
46+
47+
void srcArg(Object src) { }
48+
49+
interface Handler {
50+
void handle(Object src);
51+
}
52+
53+
@interface Tag { }
54+
55+
@Tag
56+
Object taggedSrcMethod() { return null; }
57+
58+
@Tag
59+
Object taggedSrcField;
60+
61+
Object srcTwoArg(String s1, String s2) { return null; }
62+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package my.qltest;
2+
3+
public class B {
4+
void foo() {
5+
Object arg1 = new Object();
6+
sink1(arg1);
7+
8+
Object argToTagged = new Object();
9+
taggedSinkMethod(argToTagged);
10+
11+
Object fieldWrite = new Object();
12+
taggedField = fieldWrite; // not currently handled
13+
}
14+
15+
Object sinkMethod() {
16+
Object res = new Object();
17+
return res;
18+
}
19+
20+
@Tag
21+
Object taggedSinkMethod() {
22+
Object resTag = new Object();
23+
return resTag;
24+
}
25+
26+
void sink1(Object x) { }
27+
28+
@interface Tag { }
29+
30+
@Tag
31+
void taggedSinkMethod(Object x) { }
32+
33+
@Tag
34+
Object taggedField;
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package my.qltest;
2+
3+
public class C {
4+
void foo() {
5+
Object arg1 = new Object();
6+
stepArgRes(arg1);
7+
8+
Object argIn1 = new Object();
9+
Object argOut1 = new Object();
10+
stepArgArg(argIn1, argOut1);
11+
Object argIn2 = new Object();
12+
Object argOut2 = new Object();
13+
stepArgArg(argIn2, argOut2);
14+
15+
Object arg2 = new Object();
16+
stepArgQual(arg2);
17+
Object arg3 = new Object();
18+
this.stepArgQual(arg3);
19+
20+
this.stepQualRes();
21+
stepQualRes();
22+
23+
Object argOut = new Object();
24+
stepQualArg(argOut);
25+
}
26+
27+
Object stepArgRes(Object x) { return null; }
28+
29+
void stepArgArg(Object in, Object out) { }
30+
31+
void stepArgQual(Object x) { }
32+
33+
Object stepQualRes() { return null; }
34+
35+
void stepQualArg(Object out) { }
36+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
invalidModelRow
2+
#select
3+
| B.java:6:11:6:14 | arg1 | qltest |
4+
| B.java:9:5:9:33 | this <.method> | qltest-arg |
5+
| B.java:9:22:9:32 | argToTagged | qltest-arg |
6+
| B.java:17:12:17:14 | res | qltest |
7+
| B.java:23:12:23:17 | resTag | qltest-retval |
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import java
2+
import semmle.code.java.dataflow.DataFlow
3+
import semmle.code.java.dataflow.ExternalFlow
4+
import CsvValidation
5+
6+
class SinkModelTest extends SinkModelCsv {
7+
override predicate row(string row) {
8+
row =
9+
[
10+
//"package;type;overrides;name;signature;ext;spec;kind",
11+
"my.qltest;B;false;sink1;(Object);;Argument[0];qltest",
12+
"my.qltest;B;false;sinkMethod;();;ReturnValue;qltest",
13+
"my.qltest;B$Tag;false;;;Annotated;ReturnValue;qltest-retval",
14+
"my.qltest;B$Tag;false;;;Annotated;Argument;qltest-arg",
15+
"my.qltest;B$Tag;false;;;Annotated;;qltest-nospec"
16+
]
17+
}
18+
}
19+
20+
from DataFlow::Node node, string kind
21+
where sinkNode(node, kind)
22+
select node, kind
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
invalidModelRow
2+
#select
3+
| A.java:6:9:6:14 | src1(...) | qltest |
4+
| A.java:6:9:6:14 | src1(...) | qltest-all-overloads |
5+
| A.java:7:9:7:16 | src1(...) | qltest |
6+
| A.java:7:9:7:16 | src1(...) | qltest-all-overloads |
7+
| A.java:7:9:7:16 | src1(...) | qltest-alt |
8+
| A.java:10:9:10:18 | src2(...) | qltest |
9+
| A.java:10:9:10:18 | src2(...) | qltest-w-subtypes |
10+
| A.java:11:9:11:18 | src3(...) | qltest-w-subtypes |
11+
| A.java:13:5:13:13 | this <.method> [post update] | qltest-argany |
12+
| A.java:13:12:13:12 | x [post update] | qltest-argany |
13+
| A.java:13:12:13:12 | x [post update] | qltest-argnum |
14+
| A.java:15:17:15:25 | srcparam1 | qltest-param-override |
15+
| A.java:18:36:18:51 | srcparam2 | qltest-param-override |
16+
| A.java:21:9:21:25 | taggedSrcMethod(...) | qltest-retval |
17+
| A.java:22:9:22:22 | taggedSrcField | qltest-nospec |
18+
| A.java:24:9:24:25 | srcTwoArg(...) | qltest-longsig |
19+
| A.java:24:9:24:25 | srcTwoArg(...) | qltest-shortsig |
20+
| A.java:28:8:28:14 | parameter this | qltest-param |
21+
| A.java:28:16:28:39 | taggedMethodParam | qltest-param |
22+
| A.java:31:16:31:41 | taggedSrcParam | qltest-nospec |
23+
| A.java:31:16:31:41 | taggedSrcParam | qltest-param |
24+
| A.java:56:10:56:24 | parameter this | qltest-param |
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import java
2+
import semmle.code.java.dataflow.DataFlow
3+
import semmle.code.java.dataflow.ExternalFlow
4+
import CsvValidation
5+
6+
class SourceModelTest extends SourceModelCsv {
7+
override predicate row(string row) {
8+
row =
9+
[
10+
//"package;type;overrides;name;signature;ext;spec;kind",
11+
"my.qltest;A;false;src1;();;ReturnValue;qltest",
12+
"my.qltest;A;false;src1;(String);;ReturnValue;qltest",
13+
"my.qltest;A;false;src1;(java.lang.String);;ReturnValue;qltest-alt",
14+
"my.qltest;A;false;src1;;;ReturnValue;qltest-all-overloads",
15+
"my.qltest;A;false;src2;();;ReturnValue;qltest",
16+
"my.qltest;A;false;src3;();;ReturnValue;qltest",
17+
"my.qltest;A;true;src2;();;ReturnValue;qltest-w-subtypes",
18+
"my.qltest;A;true;src3;();;ReturnValue;qltest-w-subtypes",
19+
"my.qltest;A;false;srcArg;(Object);;Argument[0];qltest-argnum",
20+
"my.qltest;A;false;srcArg;(Object);;Argument;qltest-argany",
21+
"my.qltest;A$Handler;true;handle;(Object);;Parameter[0];qltest-param-override",
22+
"my.qltest;A$Tag;false;;;Annotated;ReturnValue;qltest-retval",
23+
"my.qltest;A$Tag;false;;;Annotated;Parameter;qltest-param",
24+
"my.qltest;A$Tag;false;;;Annotated;;qltest-nospec",
25+
"my.qltest;A;false;srcTwoArg;(String,String);;ReturnValue;qltest-shortsig",
26+
"my.qltest;A;false;srcTwoArg;(java.lang.String,java.lang.String);;ReturnValue;qltest-longsig"
27+
]
28+
}
29+
}
30+
31+
from DataFlow::Node node, string kind
32+
where sourceNode(node, kind)
33+
select node, kind
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
invalidModelRow
2+
#select
3+
| C.java:6:16:6:19 | arg1 | C.java:6:5:6:20 | stepArgRes(...) | qltest |
4+
| C.java:10:16:10:21 | argIn1 | C.java:10:24:10:30 | argOut1 [post update] | qltest |
5+
| C.java:13:16:13:21 | argIn2 | C.java:13:24:13:30 | argOut2 [post update] | qltest |
6+
| C.java:16:17:16:20 | arg2 | C.java:16:5:16:21 | this <.method> [post update] | qltest |
7+
| C.java:18:22:18:25 | arg3 | C.java:18:5:18:8 | this [post update] | qltest |
8+
| C.java:20:5:20:8 | this | C.java:20:5:20:22 | stepQualRes(...) | qltest |
9+
| C.java:21:5:21:17 | this <.method> | C.java:21:5:21:17 | stepQualRes(...) | qltest |
10+
| C.java:24:5:24:23 | this <.method> | C.java:24:17:24:22 | argOut [post update] | qltest |
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import java
2+
import semmle.code.java.dataflow.DataFlow
3+
import semmle.code.java.dataflow.ExternalFlow
4+
import CsvValidation
5+
6+
class SummaryModelTest extends SummaryModelCsv {
7+
override predicate row(string row) {
8+
row =
9+
[
10+
//"package;type;overrides;name;signature;ext;inputspec;outputspec;kind",
11+
"my.qltest;C;false;stepArgRes;(Object);;Argument[0];ReturnValue;qltest",
12+
"my.qltest;C;false;stepArgArg;(Object,Object);;Argument[0];Argument[1];qltest",
13+
"my.qltest;C;false;stepArgQual;(Object);;Argument[0];Argument[-1];qltest",
14+
"my.qltest;C;false;stepQualRes;();;Argument[-1];ReturnValue;qltest",
15+
"my.qltest;C;false;stepQualArg;(Object);;Argument[-1];Argument[0];qltest"
16+
]
17+
}
18+
}
19+
20+
from DataFlow::Node node1, DataFlow::Node node2, string kind
21+
where summaryStep(node1, node2, kind)
22+
select node1, node2, kind

0 commit comments

Comments
 (0)