linux-如何使用frama-c命令处理printf(“”,)和scanf(“”)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-如何使用frama-c命令处理printf(“”,)和scanf(“”)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1983字,纯文字阅读大概需要3分钟。
内容图文
![linux-如何使用frama-c命令处理printf(“”,)和scanf(“”)?](/upload/InfoBanner/zyjiaocheng/948/807a878a36914926b76bff3a3c74b831.jpg)
我正在使用此代码生成C程序的控制流程图.除内置功能(如printf和scanf)外,该功能对于所有功能均正常运行.我可以在此代码中进行哪些更改以按原样输出内置函数?
open Cil
open Cil_types
let print_stmt out =
function
| Instr i -> !Ast_printer.d_instr out i
| Return _ -> Format.pp_print_string out "<return>"
| Goto _ -> Format.pp_print_string out "<goto>"
| Break _ -> Format.pp_print_string out "<break>"
| Continue _ -> Format.pp_print_string out "<continue>"
| If (e,_,_,_) -> Format.fprintf out "if %a" !Ast_printer.d_exp e
| Switch(e,_,_,_) -> Format.fprintf out "switch %a" !Ast_printer.d_exp e
| Loop _ -> Format.fprintf out "<loop>"
| Block _ -> Format.fprintf out "<enter block>"
| UnspecifiedSequence _ -> Format.fprintf out "<enter unspecified sequence>"
| TryFinally _ | TryExcept _ -> Format.fprintf out "<try>"
class print_cfg out =
object
inherit Visitor.frama_c_inplace
method vstmt_aux s =
Format.fprintf out "s%d@[[label=\"%a\"]@];@\n" s.sid print_stmt s.skind;
List.iter
(fun succ -> Format.fprintf out "s%d -> s%d;@\n" s.sid succ.sid)
s.succs;
DoChildren
method vglob_aux g =
match g with
| GFun(f,loc) ->
Format.fprintf out "@[<hov 2>subgraph cluster_%a {@\n graph [label=\"%a\"];@\n"
Cil_datatype.Varinfo.pretty f.svar
Cil_datatype.Varinfo.pretty f.svar;
ChangeDoChildrenPost([g], fun g -> Format.fprintf out "}@\n@]"; g)
| _ -> SkipChildren
method vfile f =
Format.fprintf out "@[<hov 2>digraph cfg {@\n";
ChangeDoChildrenPost (f,fun f -> Format.fprintf out "}@."; f)
end
let run () =
let chan = open_out "cfg.out" in
let fmt = Format.formatter_of_out_channel chan in
Visitor.visitFramacFileSameGlobals (new print_cfg fmt) (Ast.get())
let () = Db.Main.extend run
解决方法:
该问题本身与可变参数函数无关,而是与文字字符串有关.您必须引用它们,否则dot认为标签已结束.尝试更换
Format.fprintf out "s%d@[[label=\"%a\"]@];@\n" s.sid print_stmt s.skind;
通过
Format.fprintf out "s%d@[[label=%S]@];@\n" s.sid (Pretty_utils.to_string print_stmt s.skind);
(请注意,%S将输出带引号的字符串.)
内容总结
以上是互联网集市为您收集整理的linux-如何使用frama-c命令处理printf(“”,)和scanf(“”)?全部内容,希望文章能够帮你解决linux-如何使用frama-c命令处理printf(“”,)和scanf(“”)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。