Spec-Zone.ru › Kotlin 2

Ограничения на генерацию аргументов

Чтобы протестировать параллельную структуру данных, Lincheck генерирует набор параллельных сценариев, случайным образом распределяя операции по разным потокам и вызывая их со случайными аргументами.

Вы можете ограничить диапазон аргументов операций, чтобы повысить вероятность обнаружения ошибки параллельного выполнения. Например, параллельные операции в хеш-таблице с большей вероятностью обратятся к одному и тому же ключу, если диапазон возможных значений ключа ограничен. Это позволяет Lincheck эффективнее выявлять состояния гонки и другие ошибки параллельного выполнения.

Чтобы ограничить диапазон генерируемых значений аргументов в Lincheck:

  1. Используйте аннотацию @Param для объявления генератора аргументов:

    @Param(name = "key", gen = IntGen::class, conf = "1:2")
    class MultiMapTest {
    }
    • name — имя генератора аргументов.

    • gen — тип генератора.

    • conf — строка конфигурации генератора. В этом случае Lincheck генерирует целочисленные значения от 1 до 2.

    Lincheck предоставляет генераторы для значений разных типов. Для каждого типа используется свой шаблон строки конфигурации.

    Подробнее см. в разделе Типы генераторов.

  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 предоставляет следующие типы генераторов аргументов:

Генератор

Шаблон конфигурации

Описание

IntGen

"min:max"

Генерирует значения Int в диапазоне от min до max включительно.

Если строка конфигурации пуста, используется полный диапазон целых чисел от Int.MIN_VALUE до Int.MAX_VALUE.

Пример: "1:3" -> [1, 2, 3]

StringGen

"maxWordLength:alphabet"
"maxWordLength"
""

Генерирует случайные строковые значения длиной до maxWordLength из предоставленного alphabet. Значение alphabet по умолчанию — [a-zA-Z\d _].
Значение maxWordLength по умолчанию — 15.

Пример:

"2:abc" -> [
    "a", "b", "c",
    "aa", "bb", "cc",
    "ab", "bc", "ac",
    "ba", "cb", "ca"
]

EnumGen

"Enum.Const1,Enum.Const2,..."

Генерирует случайное значение из указанного списка значений перечисления.

Пример:

"Enum.Const1,Enum.Const2" -> [
    Enum.Const1, 
    Enum.Const2
]

BooleanGen

""

Генерирует значения true и false. Не требует специальной строки конфигурации.

Пример: "" -> [true, false]

DoubleGen

"start:step:end"
"start:end"
""

Генерирует значения Double от start до end с шагом step.

Значение step по умолчанию — (end - start)/100.

Если строка конфигурации пуста, генерирует значения от Int.MIN_VALUE до Int.MAX_VALUE с шагом step = 0.1.

Пример: "0.0:0.1:1.0" -> [0.0, 0.1, 0.2, ..., 0.9, 1.0]

FloatGen

"start:step:end"
"start:end"
""

То же, что и DoubleGen, но значения преобразуются в Float.

Пример: "0.0:0.1:1.0" -> [0.0, 0.1, 0.2, ..., 0.9, 1.0]

LongGen

"min:max"

То же, что и IntGen, но значения преобразуются в Long.

Пример: "1:3" -> [1, 2, 3]

ShortGen

"min:max"

Генерирует значения Short в диапазоне от min до max включительно.

Если строка конфигурации пуста, используется полный диапазон коротких целых чисел от -32768 до 32767.

Пример: "1:3" -> [1, 2, 3]

ByteGen

"min:max"

Генерирует значения Byte в диапазоне от min до max включительно.

Если строка конфигурации пуста, используется полный диапазон байтов от -128 до 127.

Пример: "1:3" -> [1, 2, 3]

ThreadIdGen

""

Возвращает идентификатор текущего потока. Не требует специальной строки конфигурации.

Пример: "" -> [1, 2]

Что дальше

Узнайте, как ограничить выполнение определённых операций одним потоком в Lincheck.

См. также

  • Проверка гарантий неблокирующего прогресса

  • Определение последовательной спецификации алгоритма

15 августа 2026 г.
Настройка стратегии тестированияПараметры выполнения операций

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API