Применять допущения, сделанные моделью памяти WP во Frama-C

#frama-c

#frama-c

Вопрос:

Есть ли способ обеспечить выполнение предположений, сделанных моделью памяти WP?

Рассмотрим следующие две функции, которые необходимо проверить с помощью Frama-C:

 /*@ requires valid(a) amp;amp; valid(b);
  @ ensures A: *a == 1;
  @ ensures B: *b == 2;
  @ assigns *a, *b;
  @*/
void assign_many(int *a, int *b)
{
  *a = 1;
  *b = 2;
}


int main() {
  int a = 42;
  assign_many(amp;a, amp;a);
  //@ assert a == 1;
  //@ assert a == 2;
  return 0;
}
  

Функция assign_many не может выполнить проверку в общем случае, поскольку два аргумента могут иметь псевдонимы (как показано в main ). Однако, если вы выберете Hoare ref модель памяти, эта функция проверяет, поскольку она предполагает разделение. Но я все еще могу проверить main , даже используя Typed модель памяти. С помощью опции командной строки -wp-warn-memory-model появляется сообщение, предупреждающее вас о том, какие допущения требуются для модели памяти. Возможно ли применить эти допущения, например, добавить их в качестве предварительных условий к assign_many ?

Ответ №1:

Я боюсь, что это невозможно напрямую (т. Е. Без копирования-вставки сгенерированной спецификации в новый файл C и повторного анализа всего исходного кода: текст предупреждения, похоже, заботится о том, чтобы выразить это как действительный контракт ACSL).

Немного покопавшись в API плагина Wp, можно увидеть, что гипотезы разделения рассматриваются в MemoryContext модуле плагина, который использует свой собственный пользовательский тип данных для их представления (в отличие от предиката ACSL из стандартного AST, определенного в ядре).

Можно написать некоторый код, который будет принимать предложения, сгенерированные данной моделью для данной функции, и генерировать набор предикатов ACSL, которые затем могут быть добавлены в качестве requires предложений для этой функции (т. е. программный эквивалент копирования и вставки, упомянутого выше), но это подразумевает определенное знание Frama-C API.