Упражнения по темам Фрейм функции и Язык ACSL
-
На языке ACSL напишите спецификацию для следующей функции:
int modify(int *data, size_t sz);согласно приведенным ниже требованиям. Предложите реализацию для этой функции и докажите ее полную корректность относительно спецификации.Функция получает на вход массив размера
sz. Функция меняет местами некоторые два элемента массива и возвращает 0. Если ей это не удается, она возвращает некоторое ненулевое значение. Ничего другого функция делать не может. -
Вам дан заголовочный файл queue.h. Он содержит определения типов данных и заголовки функций для работы с очередями целых чисел. Ниже приведены требования к типу данных и функциям. Вам нужно формализовать эти требования в виде спецификации на языке ACSL и записать ее в заголовочном файле.
Обратите внимание на то, что требования допускают множество реализаций. Внимательно отразите требования в формальной спецификации.
Требования: очередь целых чисел хранится в массиве
bufferразмераcapacityкак часть непрерывная часть массива размераcount, начиная с индексаstart. Элементы извлекаются из очереди из минимального индекса подмассива. Элементы добавляются в очередь к максимальным индексам подмассива.Все функции возвращают 0 в случае успеха и ненулевое значение в случае неуспеха.
Функция
Queue__initializeвыделяет динамическую память дляbufferразмераsize. Размер очереди делается равным 0. Если функция не может это сделать, она возвращает ненулевое значение.Функция
Queue__finalizeосвобождает динамическую память подbuffer. Если функция не может это сделать, она возвращает ненулевое значение.Функция
Queue__enqueueдополняет подмассив справа значениемitem. Если функция не может это сделать, она возвращает ненулевое значение. Функции разрешается менять содержимоеqueue, если это не отражается на ее очереди. Функции не разрешается менять какую-либо память, кроме памяти под очередь.Функция
Queue__dequeueзаписывает по валидному указателюitemэлемент с минимальным индексом в подмассиве и удаляет его из очереди, если очередь непуста. Если функция не может это сделать, она возвращает ненулевое значение. Функции разрешается менять содержимоеqueue, если это не отражается на ее очереди. Функции не разрешается менять какую-либо память, кроме памяти под очередь. -
Вам дан исходный модуль queue.c для заголовочного файла queue.h из предыдущей задачи. Докажите полную корректность исходного модуля относительно вашей формальной спецификации из предыдущей задачи.
-
Вам дан исходный модуль queue_prog.c для заголовочного файла queue.h и реализации очереди queue.c из предыдущей задачи. В этом модуле находятся функции, тестирующие очередь. Докажите полную корректность этого исходного модуля относительно вашей формальной спецификации очереди и реализации очереди.
-
Разработайте реализацию очереди, выполняющую требования к queue.h. Эта реализация должна перевыделять память под
bufferпри ее недостатке в функцииQueue__enqueue. Докажите полную корректность этой реализации. Докажите полную корректность queue_prog.c относительно вашей формальной спецификации очереди и новой реализации очереди. -
Вам дан заголовочный файл queue.h. Он содержит определения типов данных и заголовки функций для работы с очередями целых чисел. Ниже приведены требования к типу данных и функциям. Вам нужно формализовать эти требования в виде спецификации на языке ACSL и записать ее в заголовочном файле.
Обратите внимание на то, что требования допускают множество реализаций. Внимательно отразите требования в формальной спецификации.
Требования:
Все функции возвращают 0 в случае успеха и ненулевое значение в случае неуспеха.
Функция
Queue__initializeинициализирует структуру данныхqueueпустой очередью. Если функция не может это сделать, она возвращает ненулевое значение.Функция
Queue__finalizeделает те действия, после которых нельзя считать, что вqueueхранится какая-либо очередь. Если функция не может это сделать, она возвращает ненулевое значение.Функция
Queue__enqueueвставляет в конец очереди значениеitem. Если функция не может это сделать, она возвращает ненулевое значение.Функция
Queue__dequeueзаписывает по валидному указателюitemэлемент из начала очереди и удаляет его из очереди. Если функция не может это сделать, она возвращает ненулевое значение. -
Вам дан исходный модуль queue.c для заголовочного файла queue.h из предыдущей задачи. Докажите полную корректность исходного модуля относительно вашей формальной спецификации из предыдущей задачи.