Frama- C * GUI представляет два вида кода:
- Код CIL (C Промежуточный язык), часто называемый нормализованный исходный код , что соответствует красивой печати AST Frama, в верхней центральной панели;
- и оригинальный исходный код, в верхней правой панели.
Я предполагаю что по проанализированному коду вы говорите о CIL (нормализованном) коде .
Каждый элемент в AST Frama- C содержит местоположение , которая является парой позиций : первая и последняя координаты (строка, строка, столбец) в исходном коде, которые соответствуют этому элементу (минус несколько исключений, такие как сгенерированные элементы, расширения макросов и т. д. c). У большинства элементов AST есть способы получить это местоположение.
В случае узлов PDG вы можете получить соответствующие операторы (если есть) и затем распечатать их местоположение, как показано в коде ниже (запустите с frama-c -pdg -load-module print_pdg.ml <file>
):
(* print_pdg.ml *)
let () = Db.Main.extend (fun () ->
Globals.Functions.iter (fun kf ->
let pdg = !Db.Pdg.get kf in
!Db.Pdg.iter_nodes (fun n ->
match PdgTypes.Node.stmt n with
| None -> ()
| Some st ->
Format.printf "%a: %a@."
Printer.pp_location (Cil_datatype.Stmt.loc st) Printer.pp_stmt st
) pdg
)
)
Обратите внимание, что мой пример сценария будет печатать каждый оператор несколько раз, если с одним оператором связано несколько узлов PDG.
По умолчанию Printer.pp_location
печатает только имя файла и строка начального символа, но вы можете создать собственный симпатичный принтер для включения столбца или координат последнего символа.
API и документация по подключаемым модулям (из вопроса в комментарии )
Некоторые плагины Frama- C (Eva, WP, E-ACSL и др. c.) Имеют свои собственные руководства, которые доступны для загрузки в Frama- C page .
Специфического руководства c для плагина Pdg не существует, но некоторые сгенерированные Ocamldo c страницы HTML можно получить из Frama- C API архив .
Однако, что Большинство разработчиков плагинов Frama- C предпочитают использовать плагин OCaml Merlin в своем любимом редакторе (emacs, vim, et c) для навигации по коду и чтения комментариев источника. (например, в файлах .mli).
Например, в Emacs C-c C-l
для имени модуля / переменной переходит к его определению, а C-c C-a
чередуется между .ml
и .mli
файлы (реализация - документация). В сочетании с автозаполнением для обнаружения модулей / функций это обеспечивает форму интерактивной документации, которая удобна для многих разработчиков OCaml.