Skip to content

Commit a1935a1

Browse files
authored
Merge pull request #23 from JetBrains-Research/dev-litmus-tests
Add more UPUB array tests
2 parents 566ea7a + af2284a commit a1935a1

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

testsuite/src/commonMain/kotlin/org/jetbrains/litmuskt/tests/UnsafePublication.kt

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.jetbrains.litmuskt.tests
22

3-
import org.jetbrains.litmuskt.autooutcomes.LitmusIOutcome
43
import org.jetbrains.litmuskt.LitmusTestContainer
4+
import org.jetbrains.litmuskt.autooutcomes.LitmusIOutcome
55
import org.jetbrains.litmuskt.autooutcomes.accept
66
import org.jetbrains.litmuskt.autooutcomes.forbid
77
import org.jetbrains.litmuskt.autooutcomes.interesting
@@ -72,13 +72,35 @@ object UnsafePublication {
7272
}
7373
}) {
7474
thread {
75-
arr = Array(10) { 0 }
75+
arr = Array(1) { 1 }
7676
}
7777
thread {
7878
r1 = arr?.get(0) ?: -1
7979
}
8080
spec {
81-
accept(0)
81+
accept(1)
82+
// 0 is the default value for `Int`. However, since Int-s in `Array<Int>` are boxed, we don't get to see a 0.
83+
// On JVM, a NullPointerException here is technically valid. Currently, there is no support for exceptions as accepted outcomes.
84+
// On Native, there is no NullPointerException, so we can see a segmentation fault.
85+
interesting(0)
86+
accept(-1)
87+
}
88+
}
89+
90+
val PlainIntArray = litmusTest({
91+
object : LitmusIOutcome() {
92+
var arr: IntArray? = null
93+
}
94+
}) {
95+
thread {
96+
arr = IntArray(1) { 1 }
97+
}
98+
thread {
99+
r1 = arr?.get(0) ?: -1
100+
}
101+
spec {
102+
accept(1)
103+
interesting(0)
82104
accept(-1)
83105
}
84106
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.jetbrains.litmuskt
2+
3+
import org.jetbrains.litmuskt.autooutcomes.LitmusIOutcome
4+
import org.jetbrains.litmuskt.autooutcomes.accept
5+
import org.jetbrains.litmuskt.autooutcomes.forbid
6+
import java.util.concurrent.atomic.AtomicIntegerArray
7+
8+
@LitmusTestContainer
9+
object UnsafePublicationJvm {
10+
val PlainAtomicIntegerArray = litmusTest({
11+
object : LitmusIOutcome() {
12+
var arr: AtomicIntegerArray? = null
13+
}
14+
}) {
15+
thread {
16+
arr = AtomicIntegerArray(intArrayOf(1))
17+
}
18+
thread {
19+
r1 = arr?.get(0) ?: -1
20+
}
21+
spec {
22+
accept(1)
23+
forbid(0)
24+
accept(-1)
25+
}
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.jetbrains.litmuskt.tests
2+
3+
import org.jetbrains.litmuskt.LitmusTestContainer
4+
import org.jetbrains.litmuskt.autooutcomes.LitmusIOutcome
5+
import org.jetbrains.litmuskt.autooutcomes.accept
6+
import org.jetbrains.litmuskt.autooutcomes.interesting
7+
import org.jetbrains.litmuskt.litmusTest
8+
import kotlin.concurrent.AtomicIntArray
9+
10+
@LitmusTestContainer
11+
object UnsafePublicationNative {
12+
13+
@OptIn(ExperimentalStdlibApi::class)
14+
val PlainAtomicIntArray = litmusTest({
15+
object : LitmusIOutcome() {
16+
var arr: AtomicIntArray? = null
17+
}
18+
}) {
19+
thread {
20+
arr = AtomicIntArray(1) { 1 }
21+
}
22+
thread {
23+
r1 = arr?.get(0) ?: -1
24+
}
25+
spec {
26+
accept(1)
27+
interesting(0)
28+
accept(-1)
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)