Merge branch 'main' into redsun82/bzlmod

This commit is contained in:
Paolo Tranquilli
2024-02-19 14:05:43 +01:00
5 changed files with 200 additions and 91 deletions

View File

@@ -48,6 +48,7 @@
| dataClass.kt:0:0:0:0 | String | TypeAccess |
| dataClass.kt:0:0:0:0 | String | TypeAccess |
| dataClass.kt:0:0:0:0 | String | TypeAccess |
| dataClass.kt:0:0:0:0 | String | TypeAccess |
| dataClass.kt:0:0:0:0 | boolean | TypeAccess |
| dataClass.kt:0:0:0:0 | copy(...) | MethodCall |
| dataClass.kt:0:0:0:0 | false | BooleanLiteral |
@@ -59,6 +60,7 @@
| dataClass.kt:0:0:0:0 | int | TypeAccess |
| dataClass.kt:0:0:0:0 | int | TypeAccess |
| dataClass.kt:0:0:0:0 | int | TypeAccess |
| dataClass.kt:0:0:0:0 | int | TypeAccess |
| dataClass.kt:0:0:0:0 | new DataClass(...) | ClassInstanceExpr |
| dataClass.kt:0:0:0:0 | other | VarAccess |
| dataClass.kt:0:0:0:0 | other | VarAccess |
@@ -112,7 +114,6 @@
| dataClass.kt:1:22:1:31 | int | TypeAccess |
| dataClass.kt:1:22:1:31 | int | TypeAccess |
| dataClass.kt:1:22:1:31 | int | TypeAccess |
| dataClass.kt:1:22:1:31 | int | TypeAccess |
| dataClass.kt:1:22:1:31 | this | ThisAccess |
| dataClass.kt:1:22:1:31 | this.x | VarAccess |
| dataClass.kt:1:22:1:31 | x | VarAccess |
@@ -124,7 +125,6 @@
| dataClass.kt:1:34:1:46 | String | TypeAccess |
| dataClass.kt:1:34:1:46 | String | TypeAccess |
| dataClass.kt:1:34:1:46 | String | TypeAccess |
| dataClass.kt:1:34:1:46 | String | TypeAccess |
| dataClass.kt:1:34:1:46 | Unit | TypeAccess |
| dataClass.kt:1:34:1:46 | this | ThisAccess |
| dataClass.kt:1:34:1:46 | this | ThisAccess |
@@ -132,79 +132,79 @@
| dataClass.kt:1:34:1:46 | this.y | VarAccess |
| dataClass.kt:1:34:1:46 | y | VarAccess |
| dataClass.kt:1:34:1:46 | y | VarAccess |
| delegates.kt:1:9:1:12 | this | ThisAccess |
| delegates.kt:1:9:1:12 | this | ThisAccess |
| delegates.kt:1:9:1:12 | this | ThisAccess |
| delegates.kt:4:18:6:5 | ...::... | PropertyRefExpr |
| delegates.kt:4:18:6:5 | ...=... | KtInitializerAssignExpr |
| delegates.kt:4:18:6:5 | Integer | TypeAccess |
| delegates.kt:4:18:6:5 | Integer | TypeAccess |
| delegates.kt:4:18:6:5 | Integer | TypeAccess |
| delegates.kt:4:18:6:5 | KProperty1<MyClass,Integer> | TypeAccess |
| delegates.kt:4:18:6:5 | Lazy<Integer> | TypeAccess |
| delegates.kt:4:18:6:5 | LazyKt | TypeAccess |
| delegates.kt:4:18:6:5 | MyClass | TypeAccess |
| delegates.kt:4:18:6:5 | a0 | VarAccess |
| delegates.kt:4:18:6:5 | a0 | VarAccess |
| delegates.kt:4:18:6:5 | get(...) | MethodCall |
| delegates.kt:4:18:6:5 | getLazyProp(...) | MethodCall |
| delegates.kt:4:18:6:5 | getValue(...) | MethodCall |
| delegates.kt:4:18:6:5 | int | TypeAccess |
| delegates.kt:4:18:6:5 | lazyProp$delegate | VarAccess |
| delegates.kt:4:18:6:5 | this | ThisAccess |
| delegates.kt:4:18:6:5 | this | ThisAccess |
| delegates.kt:4:18:6:5 | this.lazyProp$delegate | VarAccess |
| delegates.kt:4:21:6:5 | ...::... | PropertyRefExpr |
| delegates.kt:4:21:6:5 | ...=... | KtInitializerAssignExpr |
| delegates.kt:4:21:6:5 | Integer | TypeAccess |
| delegates.kt:4:21:6:5 | Integer | TypeAccess |
| delegates.kt:4:21:6:5 | Integer | TypeAccess |
| delegates.kt:4:21:6:5 | Integer | TypeAccess |
| delegates.kt:4:21:6:5 | KProperty1<MyClass,Integer> | TypeAccess |
| delegates.kt:4:21:6:5 | Lazy<Integer> | TypeAccess |
| delegates.kt:4:21:6:5 | LazyKt | TypeAccess |
| delegates.kt:4:21:6:5 | LazyKt | TypeAccess |
| delegates.kt:4:21:6:5 | MyClass | TypeAccess |
| delegates.kt:4:21:6:5 | a0 | VarAccess |
| delegates.kt:4:21:6:5 | a0 | VarAccess |
| delegates.kt:4:21:6:5 | get(...) | MethodCall |
| delegates.kt:4:21:6:5 | getLazyProp(...) | MethodCall |
| delegates.kt:4:21:6:5 | getValue(...) | MethodCall |
| delegates.kt:4:21:6:5 | int | TypeAccess |
| delegates.kt:4:21:6:5 | lazy(...) | MethodCall |
| delegates.kt:4:21:6:5 | lazyProp$delegate | VarAccess |
| delegates.kt:4:21:6:5 | this | ThisAccess |
| delegates.kt:4:21:6:5 | this | ThisAccess |
| delegates.kt:4:21:6:5 | this | ThisAccess |
| delegates.kt:4:21:6:5 | this.lazyProp$delegate | VarAccess |
| delegates.kt:4:26:6:5 | ...->... | LambdaExpr |
| delegates.kt:4:26:6:5 | Function0<Integer> | TypeAccess |
| delegates.kt:4:26:6:5 | Integer | TypeAccess |
| delegates.kt:4:26:6:5 | int | TypeAccess |
| delegates.kt:5:9:5:9 | 5 | IntegerLiteral |
| delegates.kt:8:32:11:5 | ...::... | PropertyRefExpr |
| delegates.kt:8:32:11:5 | ...::... | PropertyRefExpr |
| delegates.kt:8:32:11:5 | ...=... | KtInitializerAssignExpr |
| delegates.kt:8:32:11:5 | KMutableProperty1<MyClass,String> | TypeAccess |
| delegates.kt:8:32:11:5 | KMutableProperty1<MyClass,String> | TypeAccess |
| delegates.kt:8:32:11:5 | MyClass | TypeAccess |
| delegates.kt:8:32:11:5 | MyClass | TypeAccess |
| delegates.kt:8:32:11:5 | Object | TypeAccess |
| delegates.kt:8:32:11:5 | ReadWriteProperty<Object,String> | TypeAccess |
| delegates.kt:8:32:11:5 | String | TypeAccess |
| delegates.kt:8:32:11:5 | String | TypeAccess |
| delegates.kt:8:32:11:5 | String | TypeAccess |
| delegates.kt:8:32:11:5 | String | TypeAccess |
| delegates.kt:8:32:11:5 | String | TypeAccess |
| delegates.kt:8:32:11:5 | Unit | TypeAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a0 | VarAccess |
| delegates.kt:8:32:11:5 | a1 | VarAccess |
| delegates.kt:8:32:11:5 | a1 | VarAccess |
| delegates.kt:8:32:11:5 | get(...) | MethodCall |
| delegates.kt:8:32:11:5 | get(...) | MethodCall |
| delegates.kt:8:32:11:5 | getObservableProp(...) | MethodCall |
| delegates.kt:8:32:11:5 | getObservableProp(...) | MethodCall |
| delegates.kt:8:32:11:5 | getValue(...) | MethodCall |
| delegates.kt:8:32:11:5 | observableProp$delegate | VarAccess |
| delegates.kt:8:32:11:5 | setObservableProp(...) | MethodCall |
| delegates.kt:8:32:11:5 | setObservableProp(...) | MethodCall |
| delegates.kt:8:32:11:5 | setValue(...) | MethodCall |
| delegates.kt:8:32:11:5 | this | ThisAccess |
| delegates.kt:8:32:11:5 | this | ThisAccess |
| delegates.kt:8:32:11:5 | this | ThisAccess |
| delegates.kt:8:32:11:5 | this | ThisAccess |
| delegates.kt:8:32:11:5 | this.observableProp$delegate | VarAccess |
| delegates.kt:8:32:11:5 | this.observableProp$delegate | VarAccess |
| delegates.kt:8:5:11:5 | Unit | TypeAccess |
| delegates.kt:8:35:8:43 | INSTANCE | VarAccess |
| delegates.kt:8:35:11:5 | ...::... | PropertyRefExpr |
| delegates.kt:8:35:11:5 | ...::... | PropertyRefExpr |
| delegates.kt:8:35:11:5 | ...=... | KtInitializerAssignExpr |
| delegates.kt:8:35:11:5 | <set-?> | VarAccess |
| delegates.kt:8:35:11:5 | KMutableProperty1<MyClass,String> | TypeAccess |
| delegates.kt:8:35:11:5 | KMutableProperty1<MyClass,String> | TypeAccess |
| delegates.kt:8:35:11:5 | MyClass | TypeAccess |
| delegates.kt:8:35:11:5 | MyClass | TypeAccess |
| delegates.kt:8:35:11:5 | Object | TypeAccess |
| delegates.kt:8:35:11:5 | ReadWriteProperty<Object,String> | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | String | TypeAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a0 | VarAccess |
| delegates.kt:8:35:11:5 | a1 | VarAccess |
| delegates.kt:8:35:11:5 | a1 | VarAccess |
| delegates.kt:8:35:11:5 | get(...) | MethodCall |
| delegates.kt:8:35:11:5 | get(...) | MethodCall |
| delegates.kt:8:35:11:5 | getObservableProp(...) | MethodCall |
| delegates.kt:8:35:11:5 | getObservableProp(...) | MethodCall |
| delegates.kt:8:35:11:5 | getValue(...) | MethodCall |
| delegates.kt:8:35:11:5 | observable(...) | MethodCall |
| delegates.kt:8:57:8:62 | "<none>" | StringLiteral |
| delegates.kt:8:35:11:5 | observableProp$delegate | VarAccess |
| delegates.kt:8:35:11:5 | setObservableProp(...) | MethodCall |
| delegates.kt:8:35:11:5 | setObservableProp(...) | MethodCall |
| delegates.kt:8:35:11:5 | setValue(...) | MethodCall |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this | ThisAccess |
| delegates.kt:8:35:11:5 | this.observableProp$delegate | VarAccess |
| delegates.kt:8:35:11:5 | this.observableProp$delegate | VarAccess |
| delegates.kt:8:56:8:63 | "<none>" | StringLiteral |
| delegates.kt:8:66:11:5 | ...->... | LambdaExpr |
| delegates.kt:8:66:11:5 | Function3<KProperty<?>,String,String,Unit> | TypeAccess |
| delegates.kt:8:66:11:5 | KProperty<?> | TypeAccess |
@@ -223,23 +223,17 @@
| delegates.kt:10:23:10:25 | old | VarAccess |
| delegates.kt:10:26:10:31 | ", now " | StringLiteral |
| delegates.kt:10:33:10:35 | new | VarAccess |
| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumClass[] | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumEntries<EnumClass> | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumEntries<EnumWithFunctions> | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess |
| enumClass.kt:0:0:0:0 | EnumWithFunctions[] | TypeAccess |
| enumClass.kt:0:0:0:0 | String | TypeAccess |
| enumClass.kt:0:0:0:0 | String | TypeAccess |
| enumClass.kt:1:1:4:1 | 0 | IntegerLiteral |
| enumClass.kt:1:1:4:1 | Enum<EnumClass> | TypeAccess |
| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess |
| enumClass.kt:1:1:4:1 | new Enum(...) | ClassInstanceExpr |
| enumClass.kt:1:1:4:1 | null | NullLiteral |
| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess |
| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess |
| enumClass.kt:1:1:4:1 | EnumClass[] | TypeAccess |
| enumClass.kt:1:1:4:1 | EnumEntries<EnumClass> | TypeAccess |
| enumClass.kt:1:1:4:1 | String | TypeAccess |
| enumClass.kt:1:21:1:32 | 0 | IntegerLiteral |
| enumClass.kt:1:21:1:32 | Enum<EnumClass> | TypeAccess |
| enumClass.kt:1:21:1:32 | EnumClass | TypeAccess |
| enumClass.kt:1:21:1:32 | new Enum<EnumClass>(...) | ClassInstanceExpr |
| enumClass.kt:1:21:1:32 | null | NullLiteral |
| enumClass.kt:1:22:1:31 | ...=... | KtInitializerAssignExpr |
| enumClass.kt:1:22:1:31 | int | TypeAccess |
| enumClass.kt:1:22:1:31 | int | TypeAccess |
@@ -251,29 +245,33 @@
| enumClass.kt:2:5:2:13 | ...=... | KtInitializerAssignExpr |
| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess |
| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess |
| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess |
| enumClass.kt:2:5:2:13 | EnumClass.enum1 | VarAccess |
| enumClass.kt:2:5:2:13 | new EnumClass(...) | ClassInstanceExpr |
| enumClass.kt:2:10:2:12 | EnumClass | TypeAccess |
| enumClass.kt:2:10:2:12 | new EnumClass(...) | ClassInstanceExpr |
| enumClass.kt:2:11:2:11 | 1 | IntegerLiteral |
| enumClass.kt:3:5:3:12 | ...=... | KtInitializerAssignExpr |
| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess |
| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess |
| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess |
| enumClass.kt:3:5:3:12 | EnumClass.enum2 | VarAccess |
| enumClass.kt:3:5:3:12 | new EnumClass(...) | ClassInstanceExpr |
| enumClass.kt:3:10:3:12 | EnumClass | TypeAccess |
| enumClass.kt:3:10:3:12 | new EnumClass(...) | ClassInstanceExpr |
| enumClass.kt:3:11:3:11 | 1 | IntegerLiteral |
| enumClass.kt:6:1:16:1 | 0 | IntegerLiteral |
| enumClass.kt:6:1:16:1 | Enum<EnumWithFunctions> | TypeAccess |
| enumClass.kt:6:1:16:1 | EnumEntries<EnumWithFunctions> | TypeAccess |
| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess |
| enumClass.kt:6:1:16:1 | new Enum(...) | ClassInstanceExpr |
| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess |
| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess |
| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess |
| enumClass.kt:6:1:16:1 | EnumWithFunctions[] | TypeAccess |
| enumClass.kt:6:1:16:1 | String | TypeAccess |
| enumClass.kt:6:1:16:1 | new Enum<EnumWithFunctions>(...) | ClassInstanceExpr |
| enumClass.kt:6:1:16:1 | null | NullLiteral |
| enumClass.kt:8:3:11:4 | ...=... | KtInitializerAssignExpr |
| enumClass.kt:8:3:11:4 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess |
| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess |
| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess |
| enumClass.kt:8:3:11:4 | EnumWithFunctions.VAL | VarAccess |
| enumClass.kt:8:3:11:4 | Unit | TypeAccess |
| enumClass.kt:8:3:11:4 | VAL | TypeAccess |
| enumClass.kt:8:3:11:4 | new EnumWithFunctions(...) | ClassInstanceExpr |
| enumClass.kt:8:3:11:4 | new VAL(...) | ClassInstanceExpr |

View File

@@ -0,0 +1,49 @@
public class A {
static Object source(String s) { return null; }
static void sink(Object o) { }
static Object id(Object x) { return x; }
static void test1(int dummy) {
Object src = source("1");
Object a = src;
sink(a); // $ EqCc="1" SrcCc="1" SinkCc="1"
}
static void test2() {
Object src = source("2");
Object a = src;
sink(a); // $ EqCc="2" SrcCc="2" SinkCc="2"
}
void test3() {
Object src = source("3");
Object a = id(src);
sink(a); // $ EqCc="3" SrcCc="3" SinkCc="3"
}
static void test4() {
Object src = source("4");
Object a = id(src);
sink(a); // $ EqCc="4" SrcCc="4" SinkCc="4"
}
static Object test5src() {
return source("5");
}
static void test5() {
Object x = test5src();
Object y = id(x);
sink(y); // $ SinkCc="5"
}
static void test6sink(Object x) {
sink(x); // $ SrcCc="6"
}
static void test6() {
Object x = source("6");
test6sink(x);
}
}

View File

@@ -0,0 +1,2 @@
testFailures
failures

View File

@@ -0,0 +1,60 @@
import java
import semmle.code.java.dataflow.DataFlow
import TestUtilities.InlineExpectationsTest
module Base {
predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getMethod().hasName("source") }
predicate isSink(DataFlow::Node n) {
exists(MethodCall ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument())
}
}
module ConfigSourceCc implements DataFlow::ConfigSig {
import Base
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
}
module ConfigSinkCc implements DataFlow::ConfigSig {
import Base
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext }
}
module ConfigEqualCc implements DataFlow::ConfigSig {
import Base
DataFlow::FlowFeature getAFeature() {
result instanceof DataFlow::FeatureEqualSourceSinkCallContext
}
}
module FlowSourceCc = DataFlow::Global<ConfigSourceCc>;
module FlowSinkCc = DataFlow::Global<ConfigSinkCc>;
module FlowEqualCc = DataFlow::Global<ConfigEqualCc>;
module HasFlowTest implements TestSig {
string getARelevantTag() { result = ["SrcCc", "SinkCc", "EqCc"] }
predicate hasActualResult(Location location, string element, string tag, string value) {
exists(DataFlow::Node src, DataFlow::Node sink |
tag = "SrcCc" and
FlowSourceCc::flow(src, sink)
or
tag = "SinkCc" and
FlowSinkCc::flow(src, sink)
or
tag = "EqCc" and
FlowEqualCc::flow(src, sink)
|
sink.getLocation() = location and
element = sink.toString() and
value = src.asExpr().(MethodCall).getAnArgument().toString()
)
}
}
import MakeTest<HasFlowTest>

View File

@@ -83,7 +83,7 @@ module MakeImplCommon<InputSig Lang> {
class LocalSourceNode extends Node {
LocalSourceNode() {
storeStep(_, this, _) or
loadStep(_, this, _) or
loadStep0(_, this, _) or
jumpStepCached(_, this) or
this instanceof ParamNode or
this instanceof OutNodeExt
@@ -115,12 +115,14 @@ module MakeImplCommon<InputSig Lang> {
// TODO: support setters
predicate storeStep(Node n1, Node n2, Content f) { storeSet(n1, f, n2, _, _) }
predicate loadStep(Node n1, LocalSourceNode n2, Content f) {
private predicate loadStep0(Node n1, Node n2, Content f) {
readSet(n1, f, n2)
or
argumentValueFlowsThrough(n1, TReadStepTypesSome(_, f, _), n2)
}
predicate loadStep(Node n1, LocalSourceNode n2, Content f) { loadStep0(n1, n2, f) }
predicate loadStoreStep(Node nodeFrom, Node nodeTo, Content f1, Content f2) { none() }
predicate withContentStep(Node nodeFrom, LocalSourceNode nodeTo, ContentFilter f) { none() }
@@ -1551,9 +1553,7 @@ module MakeImplCommon<InputSig Lang> {
class CallContextSomeCall extends CallContextCall, TSomeCall {
override string toString() { result = "CcSomeCall" }
override predicate relevantFor(DataFlowCallable callable) {
exists(ParamNode p | getNodeEnclosingCallable(p) = callable)
}
override predicate relevantFor(DataFlowCallable callable) { any() }
override predicate matchesCall(DataFlowCall call) { any() }
}