Как использовать Why3 доказательства в GUI Frama-C?

Это похоже на глупый вопрос, но я в тупике. Я пытаюсь использовать Frama-C Sodium и Why3 0.86.1 (оба установлены через OPAM), чтобы доказать некоторые простые свойства. Рассмотрим эту программу (toy.c):

int main(void) {
    char *hello = "hello world!";
    /*@ assert \valid_read(hello+(0..11)); */
    return 0;
}

Я хочу доказать это утверждение, используя графический интерфейс Frama-C и Why3. Итак, я бегу frama-c-gui toy.c выберите "Why3 (ide)" в качестве средства проверки и запустите "Подтверждение аннотаций функций WP" в основной функции. (В качестве альтернативы: я перехожу на вкладку "Цели WP" и запускаю отсюда IDE Why3.) Появляется Why3, я вызываю средство проверки по своему выбору, чтобы все стало зеленым, сохранил сеанс и вышел из Why3, а затем в Frama ничего не происходит -C GUI: свойство по-прежнему помечено оранжевым /"попытался проверить, но не смог решить".

Как мне сказать Frama-C на самом деле использовать доказательства, представленные Why3? Сами доказательства, безусловно, есть: если я снова открою Why3, все будет зеленым, поэтому сессия была сохранена правильно. Кроме того, Frama-C знает, что что- то произошло: когда IDE Why3 открыта, на вкладке целей WP виден небольшой символ зубчатого колеса, и он исчезает, когда я закрываю Why3.

(Я понимаю, что это конкретное свойство может быть доказано Alt-Ergo без участия Why3, но мне нужно Why3 для более сложных задач.)

2 ответа

Решение

Спасибо за сообщение об ошибке. Предлагаемое исправление, похоже, работает.

Тем не менее, мы хотели бы более тесно интегрироваться с сеансами Why-3 и импортировать обратно в Frama-C, где проверяющие стороны выполняли каждое обязательство по подтверждению. Действительно, мы исправим ошибку во время этого рефакторинга.

Предварительный ответ самому себе: похоже, что парсер Frama-C для XML-файла сеанса Why3 не совпадает с XML-файлом, созданным Why3 0.86.1. Этот патч, кажется, исправляет это:

diff -ur frama-c-Sodium-20150201/src/wp/why3_session.ml frama-c-Sodium-20150201-hacked/src/wp/why3_session.ml
--- frama-c-Sodium-20150201/src/wp/why3_session.ml  2015-03-06 16:28:27.000000000 +0100
+++ frama-c-Sodium-20150201-hacked/src/wp/why3_session.ml   2015-09-17 21:35:30.717409735 +0200
@@ -160,6 +160,20 @@
   let name = string_attribute "name" elt in
   name

+let load_result parent_goal r =
+  match r.Xml.name with
+  | "result" ->
+      let status = string_attribute "status" r in
+      assert (parent_goal.goal_verified = false);
+      parent_goal.goal_verified <- (status = "valid")
+  | _ -> ()
+
+let load_proof parent p =
+  match p.Xml.name with
+  | "proof" ->
+      List.iter (load_result parent) p.Xml.elements
+  | _ -> ()
+
 let rec load_goal parent g =
   match g.Xml.name with
   | "goal" ->
@@ -168,7 +182,9 @@
       let mg =
         raw_add_no_task parent gname
       in
-      mg.goal_verified <- verified
+      mg.goal_verified <- verified;
+      (* hack for different(?) session file format *)
+      List.iter (load_proof mg) g.Xml.elements
   | "label" -> ()
   | s ->
       Wp_parameters.debug

Нет гарантий, что это будет работать для кого-то еще (или даже, что это правильно для моих собственных нужд, хотя я так думаю).

Любые разработчики Frama-C здесь, случайно, кто мог бы прокомментировать?

Другие вопросы по тегам