Ограничения на генерацию аргументов
Чтобы протестировать параллельную структуру данных, Lincheck генерирует набор параллельных сценариев, случайным образом распределяя операции по разным потокам и вызывая их со случайными аргументами.
Вы можете ограничить диапазон аргументов операций, чтобы повысить вероятность обнаружения ошибки параллельного выполнения. Например, параллельные операции в хеш-таблице с большей вероятностью обратятся к одному и тому же ключу, если диапазон возможных значений ключа ограничен. Это позволяет Lincheck эффективнее выявлять состояния гонки и другие ошибки параллельного выполнения.
Чтобы ограничить диапазон генерируемых значений аргументов в Lincheck:
-
Используйте аннотацию
@Paramдля объявления генератора аргументов:@Param(name = "key", gen = IntGen::class, conf = "1:2") class MultiMapTest { }name— имя генератора аргументов.gen— тип генератора.conf— строка конфигурации генератора. В этом случае Lincheck генерирует целочисленные значения от 1 до 2.
-
Добавьте к параметрам операций аннотацию
@Param, чтобы применить ограничения:@Operation fun add(@Param(name = "key") key: Int, value: Int) = map.add(key, value) @Operation fun get(@Param(name = "key") key: Int) = map.get(key)
С установленными ограничениями Lincheck генерирует сценарии, используя только значения из указанного диапазона:
| ---------------------------------- | | Thread 1 | Thread 2 | | ---------------------------------- | | add(2, 0): void | add(2, -1): void | | ---------------------------------- | | get(2): [-1] | | | ---------------------------------- |
Типы генераторов
Lincheck предоставляет следующие типы генераторов аргументов:
Генератор |
Шаблон конфигурации |
Описание |
|---|---|---|
|
|
Генерирует значения |
|
|
Генерирует случайные строковые значения длиной до "2:abc" -> [
"a", "b", "c",
"aa", "bb", "cc",
"ab", "bc", "ac",
"ba", "cb", "ca"
]
|
|
|
Генерирует случайное значение из указанного списка значений перечисления. "Enum.Const1,Enum.Const2" -> [
Enum.Const1,
Enum.Const2
]
|
|
|
Генерирует значения |
|
|
Генерирует значения |
|
|
То же, что и |
|
|
То же, что и |
|
|
Генерирует значения |
|
|
Генерирует значения |
|
|
Возвращает идентификатор текущего потока. Не требует специальной строки конфигурации. |
Что дальше
Узнайте, как ограничить выполнение определённых операций одним потоком в Lincheck.
См. также
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/lincheck-argument-generation-constraints.html