reads some values from statically-reachable memory, and
modifies the content of the same memory during the test
it can lead to non-determinism error (the Lincheck would not be able to replay the execution trace, because the content of the static memory changed).
[Above by statically-reachable memory we mean any mutable state reachable from static variables.]
Note that during the test statically-reachable memory can be modified both by
static initialization blocks (<clinit>),
and the regular functions from the test.
Thus, in order to fix possible non-determinism errors, we need to track modifications performed by <clinit> blocks, save them into trace, and manually re-perform them during replay (in the same order as in the original execution).
Currently, if a Lincheck test execution both:
it can lead to non-determinism error (the Lincheck would not be able to replay the execution trace, because the content of the static memory changed).
[Above by statically-reachable memory we mean any mutable state reachable from static variables.]
Note that during the test statically-reachable memory can be modified both by
<clinit>
),Thus, in order to fix possible non-determinism errors, we need to track modifications performed by
<clinit>
blocks, save them into trace, and manually re-perform them during replay (in the same order as in the original execution).