Skip to content

Java fuzzer ignores type parameters of field types #2430

Closed
@IlyaMuravjov

Description

@IlyaMuravjov

Description

Java fuzzer ignores type parameters of fields (raw types are used), for example, in class below List is used instead of List<String>, causing fuzzer to generate lists of arbitrary Objects.

public class StringListHolder {
    private List<String> strings;

    public List<String> getStrings() {
        return strings;
    }

    public void setStrings(List<String> strings) {
        this.strings = strings;
    }

    public void methodUnderTest() {}
}

To Reproduce

Run the following unit test

@Test
fun `fuzzer correctly works with settable field that has a parameterized type`() {
    val seenStringListHolders = mutableListOf<StringListHolder>()
    var remainingRuns = 100
    runBlockingWithContext {
        runJavaFuzzing(
            TestIdentityPreservingIdGenerator,
            methodUnderTest = StringListHolder::methodUnderTest.javaMethod!!.executableId,
            constants = emptyList(),
            names = emptyList(),
        ) { thisInstance, _, _ ->
            thisInstance?.let {
                seenStringListHolders.add(
                    ValueConstructor().construct(listOf(it.model)).single().value as StringListHolder
                )
            }
            remainingRuns--
            BaseFeedback(Trie.emptyNode(), if (remainingRuns > 0) Control.CONTINUE else Control.STOP)
        }
    }
    val seenStrings = seenStringListHolders.flatMap { it.strings.orEmpty().filterNotNull() }
    assertNotEquals(emptyList<String>(), seenStrings)
    seenStrings.forEach { assertInstanceOf(String::class.java, it) }
}

Expected behavior

Test passes.

Actual behavior

Test fails.

Visual proofs (screenshots, logs, images)

class java.lang.Object cannot be cast to class java.lang.String (java.lang.Object and java.lang.String are in module java.base of loader 'bootstrap')
java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.String (java.lang.Object and java.lang.String are in module java.base of loader 'bootstrap')
	at org.utbot.fuzzing.JavaFuzzingTest.fuzzer correctly works with settable field that has a parameterized type(JavaFuzzingTest.kt:412)

Metadata

Metadata

Assignees

Labels

comp-fuzzingIssue is related to the fuzzingctg-bugIssue is a buglang-javaIssue is related to Java support

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions