Вы проверяете некоторые хитрые манипуляции с памятью для «новичка».
Конструкция ACSL \old
работает не совсем так, как вы думаете.
Во-первых, \old(handle)
впостусловие совпадает с handle
, потому что handle
является параметром.Контракт предназначен для использования с точки зрения абонентов.Даже если функция wait
изменила handle
(что было бы необычно, но возможно), ее контракт по-прежнему должен был бы связывать значения, передаваемые вызывающей стороной в качестве аргумента, и состояние, возвращаемое функцией вызывающей стороне.
Вкратце, в постусловии ACSL, parameter
всегда означает \old(parameter)
(даже если функция изменяет parameter
как локальная переменная).
Second,Правило выше только для параметров.Для глобальных переменных и обращений к памяти пост-условие считается применимым к пост-состоянию, как и следовало ожидать от его имени.Написанная вами конструкция \old(handle)->data
, эквивалентная handle->data
, означает «поле .data
, на которое указывает старое значение handle в новом состоянии», так что постусловие handle->data == \old(handle)->data
являетсятавтология и, вероятно, не то, что вы намеревались.
Из контекста выясняется, что вы вместо этого намеревались handle->data == \old(handle->data)
, что означает "поле .data
, на которое указывает старое значение handle
в новом состоянии.равно полю .data
, на которое указывает старое значение handle
в старом состоянии ». С этим изменением все утверждения в вашей программе будут доказаны для меня (используя Alt-Ergo 0,93).