Запрос нескольких (или всех) трассировок нарушений в Spin

Можно ли получить несколько (или все) трассировок нарушений для свойства с помощью Spin?

В качестве примера я создал модель Promela ниже:

byte mutex = 0;

active proctype A() {
A1: mutex==0; /* Is free? */
A2: mutex++;  /* Get mutex */
A3: /* A's critical section */
A4: mutex--;  /* Release mutex */
}

active proctype B() {
B1: mutex==0; /* Is free? */
B2: mutex++;  /* Get mutex */
B3: /* B's critical section */
B4: mutex--;  /* Release mutex */
}

ltl {[] (mutex < 2)}

Он имеет наивную реализацию мьютекса. Можно было ожидать, что процессы A и B не достигнут своей критической секции вместе, и я написал LTL-выражение, чтобы проверить это.

Бег

spin -run mutex_example.pml

показывает, что свойство недопустимо и работает

spin -p -t mutex_example.pml

показать последовательность операторов, которые нарушают свойство.

Never claim moves to line 4     [(1)]
  2:    proc  1 (B:1) mutex_example.pml:11 (state 1)    [((mutex==0))]
  4:    proc  0 (A:1) mutex_example.pml:4 (state 1)     [((mutex==0))]
  6:    proc  1 (B:1) mutex_example.pml:12 (state 2)    [mutex = (mutex+1)]
  8:    proc  0 (A:1) mutex_example.pml:5 (state 2)     [mutex = (mutex+1)]
spin: _spin_nvr.tmp:3, Error: assertion violated
spin: text of failed assertion: assert(!(!((mutex<2))))
Never claim moves to line 3     [assert(!(!((mutex<2))))]
spin: trail ends after 9 steps
#processes: 2
                mutex = 2
  9:    proc  1 (B:1) mutex_example.pml:14 (state 3)
  9:    proc  0 (A:1) mutex_example.pml:7 (state 3)
  9:    proc  - (ltl_0:1) _spin_nvr.tmp:2 (state 6)

Это показывает, что последовательность операторов (обозначенных метками) 'B1' -> 'A1' -> 'B2' -> 'A2' нарушает это свойство, но есть и другие варианты чередования, ведущие к этому (например, 'A1' -> ' В1' -> 'В2' -> 'А2').

Могу ли я попросить Spin предоставить мне несколько (или все) трассировок?


person Braulio Horta    schedule 30.08.2016    source источник


Ответы (1)


Я сомневаюсь, что вы сможете получить все следы нарушений в Spin.

Например, если мы рассмотрим следующую модель, то будет бесконечно много контрпримеров.

byte mutex = 0;

active [2] proctype P() {
    do
       :: mutex == 0 ->
           mutex++;
           /* critical section */
           mutex--;
    od
}

ltl {[] (mutex <= 1)}

Что вы можете сделать, так это использовать другие алгоритмы поиска для вашего верификатора, и это может привести к некоторым противоположным примерам.

-search  (or -run) generate a verifier, and compile and run it
      options before -search are interpreted by spin to parse the input
      options following a -search are used to compile and run the verifier pan
        valid options that can follow a -search argument include:
        -bfs    perform a breadth-first search
        -bfspar perform a parallel breadth-first search
        -bcs    use the bounded-context-switching algorithm
        -bitstate   or -bit, use bitstate storage
        -biterate   use bitstate with iterative search refinement (-w18..-w35)
        -swarmN,M like -biterate, but running all iterations in parallel
            perform N parallel runs and increment -w every M runs
            default value for N is 10, default for M is 1
        -link file.c  link executable pan to file.c
        -collapse   use collapse state compression
        -hc     use hash-compact storage
        -noclaim    ignore all ltl and never claims
        -p_permute  use process scheduling order permutation
        -p_rotateN  use process scheduling order rotation by N
        -p_reverse  use process scheduling order reversal
        -ltl p  verify the ltl property named p
        -safety compile for safety properties only
        -i          use the dfs iterative shortening algorithm
        -a          search for acceptance cycles
        -l          search for non-progress cycles
    similarly, a -D... parameter can be specified to modify the compilation
    and any valid runtime pan argument can be specified for the verification
person Patrick Trentin    schedule 01.09.2016
comment
В моем примере оба процесса (A и B) конечны, поэтому количество контрпримеров должно быть конечным. - person Braulio Horta; 02.09.2016
comment
Суть здесь в том, чтобы систематически находить контрпримеры. У меня нет гарантии, что по разным параметрам поиска я не найду один и тот же контрпример много-много раз... :( - person Braulio Horta; 02.09.2016
comment
@BraulioHorta, вы правы, я соответствующим образом обновлю ответ. - person Patrick Trentin; 02.09.2016