mirror of
https://github.com/github/codeql.git
synced 2026-05-04 05:05:12 +02:00
Merge pull request #11052 from igfoo/igfoo/default-parameter-mad-flow
Kotlin: Run default-parameter-mad-flow on all platforms
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
class ConstructorWithDefaults(x: Int, y: Int = 1) { }
|
||||
|
||||
fun topLevelWithDefaults(x: Int, y: Int = 1) = 0
|
||||
fun String.extensionWithDefaults(x: Int, y: Int = 1) = 0
|
||||
|
||||
class LibClass {
|
||||
|
||||
fun memberWithDefaults(x: Int, y: Int = 1) = 0
|
||||
fun String.extensionMemberWithDefaults(x: Int, y: Int = 1) = 0
|
||||
|
||||
fun multiParameterTest(x: Int, y: Int, z: Int, w: Int = 0) = 0
|
||||
fun Int.multiParameterExtensionTest(x: Int, y: Int, w: Int = 0) = 0
|
||||
|
||||
}
|
||||
|
||||
class SomeToken {}
|
||||
|
||||
fun topLevelArgSource(st: SomeToken, x: Int = 0) {}
|
||||
fun String.extensionArgSource(st: SomeToken, x: Int = 0) {}
|
||||
|
||||
class SourceClass {
|
||||
|
||||
fun memberArgSource(st: SomeToken, x: Int = 0) {}
|
||||
|
||||
}
|
||||
|
||||
fun topLevelSink(x: Int, y: Int = 1) {}
|
||||
fun String.extensionSink(x: Int, y: Int = 1) {}
|
||||
|
||||
class SinkClass(x: Int, y: Int = 1) {
|
||||
|
||||
fun memberSink(x: Int, y: Int = 1) {}
|
||||
fun String.extensionMemberSink(x: Int, y: Int = 1) {}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
from create_database_utils import *
|
||||
import subprocess
|
||||
|
||||
subprocess.check_call([get_cmd("kotlinc"), "lib.kt", "-d", "lib"])
|
||||
run_codeql_database_create(["kotlinc user.kt -cp lib"], lang="java")
|
||||
@@ -0,0 +1,74 @@
|
||||
import java
|
||||
import semmle.code.java.dataflow.TaintTracking
|
||||
import TestUtilities.InlineExpectationsTest
|
||||
private import semmle.code.java.dataflow.ExternalFlow
|
||||
|
||||
private class Models extends SummaryModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
";ConstructorWithDefaults;true;ConstructorWithDefaults;(int,int);;Argument[0];Argument[-1];taint;manual",
|
||||
";LibKt;true;topLevelWithDefaults;(int,int);;Argument[0];ReturnValue;value;manual",
|
||||
";LibKt;true;extensionWithDefaults;(String,int,int);;Argument[1];ReturnValue;value;manual",
|
||||
";LibClass;true;memberWithDefaults;(int,int);;Argument[0];ReturnValue;value;manual",
|
||||
";LibClass;true;extensionMemberWithDefaults;(String,int,int);;Argument[1];ReturnValue;value;manual",
|
||||
";LibClass;true;multiParameterTest;(int,int,int,int);;Argument[0..1];ReturnValue;value;manual",
|
||||
";LibClass;true;multiParameterExtensionTest;(int,int,int,int);;Argument[0, 1];ReturnValue;value;manual",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
private class SourceModels extends SourceModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
";LibKt;true;topLevelArgSource;(SomeToken,int);;Argument[0];kotlinMadFlowTest;manual",
|
||||
";LibKt;true;extensionArgSource;(String,SomeToken,int);;Argument[1];kotlinMadFlowTest;manual",
|
||||
";SourceClass;true;memberArgSource;(SomeToken,int);;Argument[0];kotlinMadFlowTest;manual"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
private class SinkModels extends SinkModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
";SinkClass;true;SinkClass;(int,int);;Argument[0];kotlinMadFlowTest;manual",
|
||||
";LibKt;true;topLevelSink;(int,int);;Argument[0];kotlinMadFlowTest;manual",
|
||||
";LibKt;true;extensionSink;(String,int,int);;Argument[1];kotlinMadFlowTest;manual",
|
||||
";SinkClass;true;memberSink;(int,int);;Argument[0];kotlinMadFlowTest;manual",
|
||||
";SinkClass;true;extensionMemberSink;(String,int,int);;Argument[1];kotlinMadFlowTest;manual"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
class Config extends TaintTracking::Configuration {
|
||||
Config() { this = "Config" }
|
||||
|
||||
override predicate isSource(DataFlow::Node n) {
|
||||
n.asExpr().(MethodAccess).getCallee().getName() = "source"
|
||||
or
|
||||
sourceNode(n, "kotlinMadFlowTest")
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node n) {
|
||||
n.asExpr().(Argument).getCall().getCallee().getName() = "sink"
|
||||
or
|
||||
sinkNode(n, "kotlinMadFlowTest")
|
||||
}
|
||||
}
|
||||
|
||||
class InlineFlowTest extends InlineExpectationsTest {
|
||||
InlineFlowTest() { this = "HasFlowTest" }
|
||||
|
||||
override string getARelevantTag() { result = "flow" }
|
||||
|
||||
override predicate hasActualResult(Location location, string element, string tag, string value) {
|
||||
tag = "flow" and
|
||||
exists(DataFlow::Node src, DataFlow::Node sink, Config c | c.hasFlow(src, sink) |
|
||||
sink.getLocation() = location and
|
||||
element = sink.toString() and
|
||||
value = ""
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
fun source() = 1
|
||||
|
||||
fun sink(x: Any) { }
|
||||
|
||||
fun test(c: LibClass, sourcec: SourceClass, sinkc: SinkClass) {
|
||||
|
||||
sink(ConstructorWithDefaults(source(), 0)) // $ flow
|
||||
sink(ConstructorWithDefaults(source())) // $ flow
|
||||
|
||||
sink(topLevelWithDefaults(source(), 0)) // $ flow
|
||||
sink(topLevelWithDefaults(source())) // $ flow
|
||||
|
||||
sink("Hello world".extensionWithDefaults(source(), 0)) // $ flow
|
||||
sink("Hello world".extensionWithDefaults(source())) // $ flow
|
||||
|
||||
sink(c.memberWithDefaults(source(), 0)) // $ flow
|
||||
sink(c.memberWithDefaults(source())) // $ flow
|
||||
|
||||
sink(c.multiParameterTest(source(), 0, 0)) // $ flow
|
||||
sink(c.multiParameterTest(0, source(), 0)) // $ flow
|
||||
sink(c.multiParameterTest(0, 0, source()))
|
||||
|
||||
with(c) {
|
||||
sink("Hello world".extensionMemberWithDefaults(source(), 0)) // $ flow
|
||||
sink("Hello world".extensionMemberWithDefaults(source())) // $ flow
|
||||
}
|
||||
|
||||
with(c) {
|
||||
sink(source().multiParameterExtensionTest(0, 0)) // $ flow
|
||||
sink(0.multiParameterExtensionTest(source(), 0)) // $ flow
|
||||
sink(0.multiParameterExtensionTest(0, source()))
|
||||
}
|
||||
|
||||
run {
|
||||
val st = SomeToken()
|
||||
topLevelArgSource(st)
|
||||
sink(st) // $ flow
|
||||
}
|
||||
|
||||
run {
|
||||
val st = SomeToken()
|
||||
"Hello world".extensionArgSource(st)
|
||||
sink(st) // $ flow
|
||||
}
|
||||
|
||||
run {
|
||||
val st = SomeToken()
|
||||
sourcec.memberArgSource(st)
|
||||
sink(st) // $ flow
|
||||
}
|
||||
|
||||
SinkClass(source()) // $ flow
|
||||
topLevelSink(source()) // $ flow
|
||||
"Hello world".extensionSink(source()) // $ flow
|
||||
sinkc.memberSink(source()) // $ flow
|
||||
with(sinkc) {
|
||||
"Hello world".extensionMemberSink(source()) // $ flow
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user