Skip to content

인자 생성 제약 조건

동시성 데이터 구조를 테스트하기 위해, Lincheck은 연산을 서로 다른 스레드에 무작위로 배치하고 무작위 인자로 호출하여 일련의 동시성 시나리오를 생성합니다.

연산 인자의 범위를 제약함으로써 동시성 버그를 발견할 확률을 높일 수 있습니다. 예를 들어, 가능한 키 값의 범위가 제한되어 있으면 해시 맵의 동시 연산이 동일한 키에 접근할 가능성이 커집니다. 이를 통해 Lincheck은 경합 상태(race condition) 및 기타 동시성 버그를 더 효율적으로 노출할 수 있습니다.

Lincheck에서 생성되는 인자 값의 범위를 제한하려면 다음 단계를 따르세요:

  1. @Param 어노테이션을 사용하여 인자 생성기를 선언합니다:

    kotlin
    @Param(name = "key", gen = IntGen::class, conf = "1:2")
    class MultiMapTest {
        // 테스트들
    }
    • name – 인자 생성기의 이름.
    • gen – 생성기의 유형.
    • conf – 생성기를 위한 구성 문자열. 여기서는 Lincheck이 1에서 2 사이의 정수 값을 생성합니다.

    Lincheck은 여러 값 유형에 대한 생성기를 제공합니다. 각 유형은 서로 다른 구성 문자열 템플릿을 사용합니다.

    자세한 내용은 생성기 유형 섹션을 읽어보세요.

  2. 제약 조건을 적용할 연산 매개변수에 @Param 어노테이션을 추가합니다:

    kotlin
    @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은 지정된 범위 내의 값만 사용하여 시나리오를 생성합니다:

text
| ---------------------------------- |
|    Thread 1     |     Thread 2     |
| ---------------------------------- |
| add(2, 0): void | add(2, -1): void |
| ---------------------------------- |
| get(2): [-1]    |                  |
| ---------------------------------- |

생성기 유형

Lincheck은 다음과 같은 인자 생성기 유형을 제공합니다:

생성기구성 템플릿설명
IntGen"min:max"minmax 사이의 Int 값을 생성합니다(양 끝값 포함).

구성 문자열이 비어 있으면 Int.MIN_VALUE에서 Int.MAX_VALUE까지의 전체 정수 범위를 사용합니다.

예시: "1:3" -> [1, 2, 3]
StringGen"maxWordLength:alphabet"
"maxWordLength"
""
제공된 alphabet에서 최대 maxWordLength 길이까지의 무작위 문자열 값을 생성합니다. 기본 alphabet[a-zA-Z\d _]입니다.
기본 maxWordLength15입니다.

예시:
text
EnumGen"Enum.Const1,Enum.Const2,..."지정된 열거형(enum) 값 목록에서 무작위 값을 생성합니다.

예시:
text
BooleanGen""truefalse 값을 생성합니다. 별도의 구성 문자열이 필요하지 않습니다.

예시: "" -> [true, false]
DoubleGen"start:step:end"
"start:end"
""
start부터 end까지 step만큼 증가하며 Double 값을 생성합니다.

기본 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"minmax 사이의 Short 값을 생성합니다(양 끝값 포함).

구성 문자열이 비어 있으면 -32768부터 32767까지의 전체 Short 범위를 사용합니다.

예시: "1:3" -> [1, 2, 3]
ByteGen"min:max"minmax 사이의 Byte 값을 생성합니다(양 끝값 포함).

구성 문자열이 비어 있으면 -128부터 127까지의 전체 바이트 범위를 사용합니다.

예시: "1:3" -> [1, 2, 3]
ThreadIdGen""현재 스레드의 ID 번호를 반환합니다. 별도의 구성 문자열이 필요하지 않습니다.

예시: "" -> [1, 2]

다음 단계

Lincheck에서 특정 연산을 단일 스레드로 제한하는 방법을 알아보세요.

참고 항목