Skip to content

Commit 9f2d100

Browse files
committed
Fix after review (2)
1 parent e8ed0cb commit 9f2d100

File tree

5 files changed

+52
-35
lines changed

5 files changed

+52
-35
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/UtSettings.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,22 +271,23 @@ object UtSettings : AbstractSettings(logger, defaultKeyForSettingsPath, defaultS
271271
var useTaintAnalysis by getBooleanProperty(false)
272272

273273
/**
274-
* If true, [Traverser] will call [TraversalContext.implicitlyThrowException] for [TaintMarksAll],
275-
* even if [TaintMarksSet] is specified, i.e. each taint mark will not be processed separately.
274+
* If it is true, [Traverser] processes all available taint marks in one request,
275+
* otherwise, it forks the state and creates checks for each one of them separately.
276276
*
277277
* @see [org.utbot.engine.Traverser.processTaintSink]
278278
*/
279-
var ThrowTaintErrorOnlyForAllMarks = false
279+
var throwTaintErrorOnlyForAllMarks = false
280280

281281
/**
282282
* How deep we should analyze the throwables.
283283
*/
284284
val exploreThrowableDepth: ExploreThrowableDepth
285285
get() =
286-
if (useTaintAnalysis)
286+
if (useTaintAnalysis) {
287287
ExploreThrowableDepth.EXPLORE_ALL_STATEMENTS
288-
else
288+
} else {
289289
ExploreThrowableDepth.SKIP_ALL_STATEMENTS
290+
}
290291

291292
// region engine process debug
292293

utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2705,7 +2705,7 @@ class Traverser(
27052705
val parameters = resolveParameters(invokeExpr.args, invokeExpr.method.parameterTypes)
27062706

27072707
if (UtSettings.useTaintAnalysis) {
2708-
processTaintSink(SymbolicMethodData(invokeExpr.method.executableId, null, parameters, null))
2708+
processTaintSink(SymbolicMethodData(invokeExpr.method.executableId, base = null, args = parameters, result = null))
27092709
}
27102710

27112711
val result = mockMakeSymbolic(invokeExpr) ?: mockStaticMethod(invokeExpr.method, parameters)
@@ -2738,7 +2738,7 @@ class Traverser(
27382738
val resolvedParameters = resolveParameters(parameters, method.parameterTypes)
27392739

27402740
if (UtSettings.useTaintAnalysis) {
2741-
processTaintSink(SymbolicMethodData(method.executableId, instance, resolvedParameters, null))
2741+
processTaintSink(SymbolicMethodData(method.executableId, instance, resolvedParameters, result = null))
27422742
}
27432743

27442744
val invocation = Invocation(instance, method, resolvedParameters) {
@@ -2911,7 +2911,7 @@ class Traverser(
29112911
val parameters = resolveParameters(invokeExpr.args, method.parameterTypes)
29122912

29132913
if (UtSettings.useTaintAnalysis) {
2914-
processTaintSink(SymbolicMethodData(method.executableId, instance, parameters, null))
2914+
processTaintSink(SymbolicMethodData(method.executableId, instance, parameters, result = null))
29152915
}
29162916

29172917
val invocation = Invocation(instance, method, parameters, InvocationTarget(instance, method))
@@ -4270,33 +4270,49 @@ class Traverser(
42704270
}
42714271

42724272
private fun TraversalContext.processTaintSink(methodData: SymbolicMethodData) {
4273-
val methodName = methodData.methodId.simpleNameWithClass
42744273
val sinkConfigurations = taintContext.configuration.getSinksBy(methodData.methodId)
4275-
4276-
for (sink in sinkConfigurations) {
4274+
sinkConfigurations.forEach { sink ->
42774275
val condition = sink.condition.toBoolExpr(this@Traverser, methodData)
4276+
sink.check.entities.forEach { entity ->
4277+
implicitlyThrowTaintError(methodData, entity, sink.marks, condition)
4278+
}
4279+
}
4280+
}
4281+
4282+
private fun TraversalContext.implicitlyThrowTaintError(
4283+
methodData: SymbolicMethodData,
4284+
entity: TaintEntity,
4285+
marks: TaintMarks,
4286+
condition: UtBoolExpression,
4287+
) {
4288+
val symbolicEntity = methodData.choose(entity) ?: return
4289+
val entityAddr = symbolicEntity.addrOrNull ?: return
4290+
val containsAnyMark = taintContext.markManager.containsAnyMark(memory, entityAddr)
4291+
4292+
val methodName = methodData.methodId.simpleNameWithClass
4293+
val taintedVarType = symbolicEntity.type.toQuotedString()
42784294

4279-
for (entity in sink.check.entities) {
4280-
val symbolicEntity = methodData.choose(entity) ?: continue
4281-
val entityAddr = symbolicEntity.addrOrNull ?: continue
4282-
val taintedVarType = symbolicEntity.type.toQuotedString()
4295+
if (UtSettings.throwTaintErrorOnlyForAllMarks) {
4296+
implicitlyThrowException(
4297+
TaintAnalysisError(methodName, taintedVarType, "tainted"),
4298+
setOf(mkAnd(containsAnyMark, condition))
4299+
)
4300+
return
4301+
}
42834302

4284-
if (sink.marks is TaintMarksAll || UtSettings.ThrowTaintErrorOnlyForAllMarks) {
4285-
val containsAnyMark = taintContext.markManager.containsAnyMark(memory, entityAddr)
4303+
when (marks) {
4304+
is TaintMarksAll ->
4305+
implicitlyThrowException(
4306+
TaintAnalysisError(methodName, taintedVarType, "tainted"),
4307+
setOf(mkAnd(containsAnyMark, condition))
4308+
)
4309+
is TaintMarksSet -> {
4310+
marks.marks.forEach { mark ->
4311+
val containsMark = taintContext.markManager.containsMark(memory, entityAddr, mark)
42864312
implicitlyThrowException(
4287-
TaintAnalysisError(methodName, taintedVarType, "tainted"),
4288-
setOf(mkAnd(containsAnyMark, condition))
4313+
TaintAnalysisError(methodName, taintedVarType, mark.name),
4314+
setOf(mkAnd(containsMark, condition))
42894315
)
4290-
} else if (sink.marks is TaintMarksSet) {
4291-
for (mark in sink.marks.marks) {
4292-
val containsMark = taintContext.markManager.containsMark(memory, entityAddr, mark)
4293-
implicitlyThrowException(
4294-
TaintAnalysisError(methodName, taintedVarType, mark.name),
4295-
setOf(mkAnd(containsMark, condition))
4296-
)
4297-
}
4298-
} else {
4299-
error("${sink.marks::class.java.canonicalName} not is TaintMarksAll and not is TaintMarksSet")
43004316
}
43014317
}
43024318
}

utbot-framework/src/main/kotlin/org/utbot/taint/TaintMarkManager.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ class TaintMarkManager(private val markRegistry: TaintMarkRegistry) {
2222
val taintVector = memory.taintVector(addr).toLongValue()
2323
val taintMarkId = markRegistry.idByMark(mark)
2424
val taintMarkVector = mkLong(taintMarkId).toLongValue()
25-
return mkNot(mkEq(And(taintVector, taintMarkVector), bvExpr0))
25+
return mkNot(mkEq(And(taintVector, taintMarkVector), emptyTaintVector))
2626
}
2727

2828
/**
2929
* Returns true if taint vector at address [addr] in [memory] contains any taint mark.
3030
*/
3131
fun containsAnyMark(memory: Memory, addr: UtAddrExpression): UtBoolExpression {
3232
val taintVector = memory.taintVector(addr).toLongValue()
33-
return mkNot(mkEq(taintVector, bvExpr0.toLongValue()))
33+
return mkNot(mkEq(taintVector, emptyTaintVector.toLongValue()))
3434
}
3535

3636
/**
@@ -104,7 +104,7 @@ class TaintMarkManager(private val markRegistry: TaintMarkRegistry) {
104104
val taintMarks = constructTaintVector(marks).toLongValue()
105105
val oldTaintVectorFrom = memory.taintVector(fromAddr).toLongValue()
106106
val intersection = And(taintMarks, oldTaintVectorFrom)
107-
val hasAtLeastOneMark = mkNot(mkEq(intersection, bvExpr0))
107+
val hasAtLeastOneMark = mkNot(mkEq(intersection, emptyTaintVector))
108108

109109
val oldTaintVectorExprTo = memory.taintVector(toAddr)
110110
val newTaintVectorExprTo = Or(oldTaintVectorExprTo.toLongValue(), intersection.toLongValue())
@@ -120,7 +120,7 @@ class TaintMarkManager(private val markRegistry: TaintMarkRegistry) {
120120

121121
// internal
122122

123-
private val bvExpr0 = mkLong(0L)
123+
private val emptyTaintVector = mkLong(0L)
124124

125125
/**
126126
* Returns taint vector that represents [marks].

utbot-framework/src/main/kotlin/org/utbot/taint/model/SymbolicMethodData.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ data class SymbolicMethodData(
2121

2222
companion object {
2323
fun constructInvalid(methodId: ExecutableId): SymbolicMethodData =
24-
SymbolicMethodData(methodId, null, listOf(), null)
24+
SymbolicMethodData(methodId, base = null, args = listOf(), result = null)
2525
}
2626
}

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/SettingsWindow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class SettingsWindow(val project: Project) {
8989
}
9090
row {
9191
useTaintAnalysisCheckBox =
92-
checkBox("Use taint analysis")
92+
checkBox("Enable taint analysis")
9393
.onApply {
9494
settings.state.useTaintAnalysis = useTaintAnalysisCheckBox.isSelected
9595
}

0 commit comments

Comments
 (0)