Skip to content

Commit 4874256

Browse files
authored
Merge pull request github#9229 from tamasvajk/kotlin-df-fix-list
Kotlin: extract non-private members of class supertypes
2 parents 06a8cf6 + 4732793 commit 4874256

File tree

13 files changed

+120
-2160
lines changed

13 files changed

+120
-2160
lines changed

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,7 @@ open class KotlinFileExtractor(
404404
}
405405

406406
extractClassModifiers(c, id)
407-
val forceExtractSupertypeMembers = !isExternalDeclaration(c)
408-
extractClassSupertypes(c, id, inReceiverContext = forceExtractSupertypeMembers)
407+
extractClassSupertypes(c, id, inReceiverContext = true) // inReceiverContext = true is specified to force extraction of member prototypes of base types
409408

410409
return id
411410
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class ListFlowTest {
2+
fun <T> taint(t: T) = t
3+
fun sink(a: Any) {}
4+
5+
fun test(l: MutableList<String>) {
6+
l[0] = taint("a")
7+
sink(l)
8+
sink(l[0])
9+
for (s in l) {
10+
sink(s)
11+
}
12+
13+
val a = arrayOf(taint("a"), "b")
14+
sink(a)
15+
sink(a[0])
16+
for (s in a) {
17+
sink(s)
18+
}
19+
}
20+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| list.kt:6:23:6:23 | a | list.kt:7:14:7:14 | l |
2+
| list.kt:6:23:6:23 | a | list.kt:8:14:8:17 | get(...) |
3+
| list.kt:6:23:6:23 | a | list.kt:10:18:10:18 | s |
4+
| list.kt:13:32:13:32 | a | list.kt:14:14:14:14 | a |
5+
| list.kt:13:32:13:32 | a | list.kt:15:14:15:17 | ...[...] |
6+
| list.kt:13:32:13:32 | a | list.kt:17:18:17:18 | s |
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java
2+
import semmle.code.java.dataflow.TaintTracking
3+
import semmle.code.java.dataflow.ExternalFlow
4+
5+
class Conf extends TaintTracking::Configuration {
6+
Conf() { this = "qltest:mad-summaries" }
7+
8+
override predicate isSource(DataFlow::Node n) {
9+
n.asExpr().(Argument).getCall().getCallee().hasName("taint")
10+
}
11+
12+
override predicate isSink(DataFlow::Node n) {
13+
n.asExpr().(Argument).getCall().getCallee().hasName("sink")
14+
}
15+
}
16+
17+
from DataFlow::Node src, DataFlow::Node sink, Conf conf
18+
where conf.hasFlow(src, sink)
19+
select src, sink
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
test
2+
| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | file:///modules/java.base/java/util/Collection.class:0:0:0:0 | iterator |
3+
test1
4+
| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import java
2+
3+
query predicate test(Method m1, Method m2) {
4+
m1.getName() = "iterator" and
5+
m1.getDeclaringType().getQualifiedName() = "java.util.List" and
6+
m1.overrides(m2)
7+
}
8+
9+
query predicate test1(Method m1) {
10+
m1.getName() = "iterator" and
11+
m1.getDeclaringType().getQualifiedName() = "java.util.List"
12+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.util.List;
2+
import java.util.Arrays;
3+
4+
public final class x {
5+
public final void test() {
6+
List<String> ll = Arrays.asList("a", "b");
7+
}
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
test
2+
| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | file:///modules/java.base/java/util/Collection.class:0:0:0:0 | iterator |
3+
test1
4+
| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import java
2+
3+
query predicate test(Method m1, Method m2) {
4+
m1.getName() = "iterator" and
5+
m1.getDeclaringType().getQualifiedName() = "java.util.List" and
6+
m1.overrides(m2)
7+
}
8+
9+
query predicate test1(Method m1) {
10+
m1.getName() = "iterator" and
11+
m1.getDeclaringType().getQualifiedName() = "java.util.List"
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java.util.*
2+
3+
class x {
4+
fun test() {
5+
val ll = Arrays.asList("a", "b")
6+
}
7+
}

0 commit comments

Comments
 (0)