Я попробовал этот пример в последней версии Frama-C (конечно, формат немного изменен).
для случая memcpy
Утверждение 2 не выполняется, но утверждение3 успешно доказано (в основном потому, что провал утверждения 2 приводит к ложному предположению, которое доказывает все).
Таким образом, на самом деле оба утверждения не могут быть доказаны, так же как и ваша проблема.
ЭтоВывод обоснован, потому что модели памяти, используемые в плагине wp
(насколько я знаю), не предполагают отношения между полями в структуре, т.е. в header_src
первые два поля являются 8-битными символами, но они могутне быть вложенным в физическую память, подобную char[2]
.Вместо этого между ними могут быть отступы (подробное описание см. wiki ).Поэтому, когда вы пытаетесь скопировать биты в такой структуре в другую структуру, Frama-C становится полностью сбитым с толку и понятия не имеет, что вы делаете.
Насколько мне известно, Frama-C не поддерживает какие-либоподход для точного управления макетом памяти, например, gcc PACKED, который вынуждает компилятор удалять отступы.
Я сталкиваюсь с той же проблемой, и решение (совсем не элегантное) - использовать вместо этого массивы.Массивы всегда вложены, поэтому, если вы попытаетесь скопировать char[4]
в short[2]
, я думаю, что утверждение можно доказать.
для Cast pointer to int
case
С моделью памятиTyped+cast
, текущая версия, которую я использую (Chlorine-20180501
), поддерживает приведение между указателями и uint64_t
.Возможно, вы захотите попробовать эту версию.
Более того, настоятельно рекомендуется вызывать Z3 и CVC4 через Why3, производительность которого, безусловно, лучше, чем у Alt-Ergo.