簡體   English   中英

可以使用frama-c進行頭文件分析嗎?

[英]Can frama-c be used for header file analysis?

我在將frama-c看作是在OCaml中處理C頭文件的一種方法(例如,用於生成語言綁定)。 它很有吸引力,因為它看起來像是一個記錄良好且維護良好的項目。 然而,經過大量的谷歌搜索和搜索文檔后,我找不到任何適合此目的的東西。 我只是錯過了正確的方法,或者它是否超出了frama-c的范圍? 與其他一些插件相比,它似乎是一件相當簡單的事情。

正如Pascal所說,我不認為可以從命令行進行,但是因為你必須編寫一些代碼,你可以設置標志Rmtmps.keepUnused 這是一個可用於查看聲明的腳本:

let main () =
  Rmtmps.keepUnused := true;
  let file = File.from_filename "t.h" in
  let () = File.init_from_c_files [ file ] in
  let _ast = Ast.get () in
  let show_function f =
    let name = Kernel_function.get_name f in
    if not (Cil.Builtin_functions.mem name) then
      Format.printf "Function @[<2>%a:@ @[@[type: %a@]@ @[%s at %a@]@]@]@."
        Kernel_function.pretty f
        Cil_datatype.Typ.pretty (Kernel_function.get_type f)
        (if Kernel_function.is_definition f then "defined" else "declared")
        Cil.d_loc (Kernel_function.get_location f)
in Globals.Functions.iter show_function

let () = Db.Main.extend main

要運行它,您必須使用如下的-load-script選項:

$ frama-c -load-script script.ml

開發插件更適合於更復雜的處理(參見“ 開發人員手冊 ”),但腳本可以輕松進行測試。

在當前狀態中,我會說遺憾的是不可能使用Frama-C來解析既未定義也未使用的函數的聲明。

日:

int mybinding (int x, int y);

這為您提供了標准化AST的視圖。 標准化意味着可以簡化的一切都是:

$ frama-c -print t.h
[kernel] preprocessing with "gcc -C -E -I.  t.h"
/* Generated by Frama-C */

不幸的是,由於mybinding既未使用也未定義,因此被刪除了。

有一個選項可以保留聲明的規范,但你想要的是保留所有聲明的選項。 我從來沒有注意到這樣的選擇:

$ frama-c -kernel-help
...
-keep-unused-specified-functions  keep specified-but-unused functions (set by
                    default, opposite option is
                    -remove-unused-specified-functions)

保持功能與規格的選項不符合您的要求:

$ frama-c -keep-unused-specified-functions -print t.h
[kernel] preprocessing with "gcc -C -E -I.  t.h"
/* Generated by Frama-C */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM