Для данной в третьем задании программы и построенной для неё модели:
1. Проверить свойство отсутствия тупиков (invalid end-states). Тупиков в модели быть не должно. Вывод верификатора по проверке свойства поместить в текстовой файл с именем task4_safety_out.txt.
2. В модели не должно быть недостижимого кода (unreachable code), за исключением конечных состояний процессов (-end-). Если такой код в модели найден, исправить её.
3. Сформулированные в третьей задаче свойства описать в модели с помощью assertions, проверить с помощью Spin. Возможно, потребуется ввести дополнительные переменные. Модель с assertions приложить в файле с именем task4_assert.pml. Вывод pan по проверке приложить в файле с именем task4_assert_out.txt . Нужно учитывать, что верификатор остановить проверку на первой же ошибке, поэтому для того, чтобы проверить все свойства, возможно, придётся сделать несколько вариантов модели и ли использовать конструкции #ifndef.
4. В модели не должно быть циклов бездействия (non-progress cycles), за исключением:
4.1) цикла, связанного с бесконечным выполнением моделируемой функции
4.2) циклов, соответствующих циклам моделируемой функции, которые после абстракции предикатов стали бесконечными.
Иными словами, конструкции, добавленные в модель (например, предназначенниые для моделирования случайных данных) не должны вносить в модель бесконечных циклов.
Вывод верификатора для проверки отсутствия циклов бездействия приложить в файле с именем task4_nonprogress_out.txt. Метки progress, предназначенные для того, чтобы верификатор не обращал внимания на бесконечные циклы, перечисленные в пунктах 4.1 и 4.2, должны быть расставлены в модели model_assert.pml.
5. Перечисленные ниже свойства описать с помощью логики линейного времени в формате Spin, проверить с помощью Spin. При этом не должны использоваться какие-либо вспомогательные переменные. Спецификации приложить в файле с именами spec.ltl:
1. В каждом вычислении рано или поздно происходит попытка захвата ресурса при помощи указанного вызова *alloc*.
2. В каждом вычислении, после успешного захвата ресурса рано или поздно ресурс освобождается при помощи вызова *free*,
3. На каждый вызов системной функции выделения и освобождения ресурса обязательно поступит отклик от менеджера ресурсов.
4. В критической секции (между вызовами spin_lock* и spin_unlock*) может находиться не более одного процесса.
5. В ходе одной итерации функции функция kfree вызывается не более одного раза.
Возможно, для разумной проверки свойств модель придётся изменить: исправить ошибки, повысить уровень детальности, добавить системные вызовы, не вошедшие в модель, по-другому описать алгоритм доступа к критической секции ит.п.
6a. В случае, если модель пришлось изменить:
- описать, почему спецификация не выполняется на исходной модели;
- описать, как изменилась модель и почему;
- описать, почему новая модель адекватна;
- приложить контрпример, выданный pan, в файле counterexample.txt;
- приложить исходную и изменённую модели в файлах task4.pml и task4_modified.pml;
- приложить вывод pan в файле task4_ver_out.txt.
6b. В случае, если спецификация не выполняется на модели:
- приложить контрпример, выданный pan, в файле counterexample.txt;
- построить по контрпримеру Spin контрпример на исходной программе;
- убедиться в том, что контрпример на исходной программе выполняется;
- приложить контрпример на исходной программе в файле prog_counterexample.txt. Контрпример должен быть описан в виде последовательности номеров строк исходной программы и значений переменных.
- приложить модель в файле task4.pml;
- приложить вывод pan в файле task4_ver_out.txt.
- создать вспомогательный файл со спецификацией (например, «spec_1.ltl») для проверки оставшихся свойств.
6c. В случае, если изменения в модели не потребовались и спецификация выполняется:
- приложить модель в файле task4.pml;
- приложить вывод pan в файле ver_out.txt.
Крайний срок сдачи – 26 апреля. АСВК может сдавать на семинарах 28 апреля, при выставлении зачёта.
С уважением, Константин Савенков.