1
1
package org.usvm.dataflow.ts.infer
2
2
3
3
import mu.KotlinLogging
4
- import org.jacodb.ets.base.EtsArrayAccess
5
- import org.jacodb.ets.base.EtsAssignStmt
6
- import org.jacodb.ets.base.EtsCastExpr
7
- import org.jacodb.ets.base.EtsEntity
8
- import org.jacodb.ets.base.EtsEqExpr
9
- import org.jacodb.ets.base.EtsFieldRef
10
- import org.jacodb.ets.base.EtsIfStmt
11
- import org.jacodb.ets.base.EtsInExpr
12
- import org.jacodb.ets.base.EtsInstanceCallExpr
13
- import org.jacodb.ets.base.EtsLValue
14
- import org.jacodb.ets.base.EtsLocal
15
- import org.jacodb.ets.base.EtsNewExpr
16
- import org.jacodb.ets.base.EtsNumberConstant
17
- import org.jacodb.ets.base.EtsParameterRef
18
- import org.jacodb.ets.base.EtsReturnStmt
19
- import org.jacodb.ets.base.EtsStmt
20
- import org.jacodb.ets.base.EtsStringConstant
21
- import org.jacodb.ets.base.EtsThis
22
- import org.jacodb.ets.base.EtsThrowStmt
23
- import org.jacodb.ets.base.EtsType
24
- import org.jacodb.ets.base.EtsValue
4
+ import org.jacodb.ets.model.EtsArrayAccess
5
+ import org.jacodb.ets.model.EtsAssignStmt
6
+ import org.jacodb.ets.model.EtsCastExpr
7
+ import org.jacodb.ets.model.EtsEntity
8
+ import org.jacodb.ets.model.EtsEqExpr
9
+ import org.jacodb.ets.model.EtsFieldRef
10
+ import org.jacodb.ets.model.EtsIfStmt
11
+ import org.jacodb.ets.model.EtsInExpr
12
+ import org.jacodb.ets.model.EtsInstanceCallExpr
13
+ import org.jacodb.ets.model.EtsLocal
25
14
import org.jacodb.ets.model.EtsMethod
15
+ import org.jacodb.ets.model.EtsNewExpr
16
+ import org.jacodb.ets.model.EtsNumberConstant
17
+ import org.jacodb.ets.model.EtsParameterRef
18
+ import org.jacodb.ets.model.EtsReturnStmt
19
+ import org.jacodb.ets.model.EtsStmt
20
+ import org.jacodb.ets.model.EtsStringConstant
21
+ import org.jacodb.ets.model.EtsThis
22
+ import org.jacodb.ets.model.EtsThrowStmt
23
+ import org.jacodb.ets.model.EtsType
24
+ import org.jacodb.ets.model.EtsValue
26
25
import org.jacodb.ets.utils.callExpr
27
26
import org.jacodb.impl.cfg.graphs.GraphDominators
28
27
import org.usvm.dataflow.ifds.FlowFunction
@@ -212,7 +211,8 @@ class BackwardFlowFunctions(
212
211
if (returnValue != null ) {
213
212
val variable = returnValue.toBase()
214
213
val type = if (doAddKnownTypes) {
215
- EtsTypeFact .from(returnValue.type).fixAnyToUnknown()
214
+ val knownType = returnValue.tryGetKnownType(current.method)
215
+ EtsTypeFact .from(knownType).fixAnyToUnknown()
216
216
} else {
217
217
EtsTypeFact .UnknownEtsTypeFact
218
218
}
@@ -241,14 +241,8 @@ class BackwardFlowFunctions(
241
241
// Case `x... := y`
242
242
// ∅ |= y:unknown
243
243
val type = if (doAddKnownTypes) {
244
- EtsTypeFact .from(current.rhv.type).let {
245
- // Note: convert Any to Unknown, because intersection with Any is Any
246
- if (it is EtsTypeFact .AnyEtsTypeFact ) {
247
- EtsTypeFact .UnknownEtsTypeFact
248
- } else {
249
- it
250
- }
251
- }
244
+ val knownType = current.rhv.tryGetKnownType(current.method)
245
+ EtsTypeFact .from(knownType).fixAnyToUnknown()
252
246
} else {
253
247
EtsTypeFact .UnknownEtsTypeFact
254
248
}
@@ -283,13 +277,7 @@ class BackwardFlowFunctions(
283
277
}
284
278
}
285
279
286
- val lhv = when (val l = current.lhv) {
287
- is EtsLValue -> l.toPath()
288
- else -> {
289
- logger.info { " TODO backward assign zero: $current " }
290
- error(" Unexpected LHV in assignment: $current " )
291
- }
292
- }
280
+ val lhv = current.lhv.toPath()
293
281
294
282
// Handle new possible facts for LHS:
295
283
if (lhv.accesses.isNotEmpty()) {
@@ -543,7 +531,7 @@ class BackwardFlowFunctions(
543
531
val objectWithMethod = EtsTypeFact .ObjectEtsTypeFact (
544
532
cls = null ,
545
533
properties = mapOf (
546
- callExpr.method .name to EtsTypeFact .FunctionEtsTypeFact
534
+ callExpr.callee .name to EtsTypeFact .FunctionEtsTypeFact
547
535
)
548
536
)
549
537
result + = TypedVariable (path, objectWithMethod)
@@ -552,7 +540,7 @@ class BackwardFlowFunctions(
552
540
if (doAddKnownTypes) {
553
541
// f(x:T) |= x:T, where T is the type of the argument in f's signature
554
542
for ((index, arg) in callExpr.args.withIndex()) {
555
- val param = callExpr.method .parameters.getOrNull(index) ? : continue
543
+ val param = callExpr.callee .parameters.getOrNull(index) ? : continue
556
544
val base = arg.toBase()
557
545
val type = EtsTypeFact .from(param.type)
558
546
result + = TypedVariable (base, type)
0 commit comments