Тот факт, что доказательство не удалось, связано с двумя независимыми проблемами, но ни одна из них не связана с использованием абсолютных адресов.
Во-первых, аргумент mmio_read32
помечен как volatile
, WPУчтите, что его значением может быть что угодно.В частности, известно, что ни одна из гипотез, выдвинутых на offset
, не выполняется при оценке addr
.Вы можете увидеть это в графическом интерфейсе, посмотрев на сгенерированную цель (перейдите на вкладку WP Goals внизу и дважды щелкните двоеточие Script
и строку неудачной попытки доказательства):
Goal Instance of 'Pre-condition'
(call 'mmio_read32'):
Assume {
Type: is_uint32(offset_0).
(* Pre-condition *)
Have: (0 <= offset_0) /\ (offset_0 <= 4095).
}
Prove: (234881024 <= w) /\ (w_1 <= 234885119).
w
и w_1
соответствуют двум доступам чтения к изменчивому содержимому addr
.Я не уверен, действительно ли вы предполагали, что параметр addr
будет volatile
(в отличие от не volatile
указателя на местоположение volatile
), поскольку для этого потребуется довольно странная среда выполнения.
Предполагая, что квалификатор volatile
не должен присутствовать в объявлении addr
, остается проблема в том, что ограничение на offset
в read32
слишком слабое: оно должно читать offset < 0x1000
со строгимнеравенство (или предварительное условие mmio_read32
должно быть сделано нестрогим, но, опять же, это было бы довольно редко).
Относительно первоначального вопроса о физической адресации и энергозависимости в ACSL (см. раздел 2.12.1 *)1028 * руководство ), у вас есть специальное предложение volatile
, которое позволяет вам задавать (C, обычно призрачные) функции для представления доступа для чтения и записи в volatile
местоположениях.К сожалению, поддержка этих предложений в настоящее время доступна только через не публично распространяемый плагин.
Боюсь, что если вы хотите использовать WP в коде с физической адресацией, вам действительно нужно использовать кодировку(например, с массивом-призраком соответствующего размера) и / или изменяемым доступом модели с соответствующими функциями.