关于Frama-C中调用图验证插件的问询:基于白名单的函数调用合规性检查方案
嘿,刚好我之前在项目里用Frama-C做过类似的函数调用合规性检查,给你几个实用的方案,完全匹配你的需求:
Call Graph (CG) 插件:最直接的轻量方案
Frama-C自带的CG插件就是专门用来生成和分析程序调用关系的,完全能覆盖你的基础需求。你只需要在命令行里执行:frama-c -cg your_program.c
它会输出完整的调用图结构,包含所有函数的调用链路。你要区分内部/外部调用的话,CG插件还支持过滤选项,能只显示外部函数的调用链——也就是那些没在当前代码里定义的extern函数调用,这样你只需要检查这些调用是否都在你的白名单里就行。如果想要自动化检查,还可以用Frama-C的OCaml API写个简单脚本,自动对比调用结果和白名单,不用手动逐个核对。Aorai插件:不止能处理调用序列,也能搞定白名单检查
你提到知道Aorai是处理调用序列的,但其实它的灵活性很高,完全能用来做简单的白名单验证。你只需要写一个简单的LTL(线性时序逻辑)属性,断言所有外部函数调用都必须属于你的白名单集合。比如针对你的例子,属性可以写成类似这样(要符合Aorai的语法规范):always (call(bar) || !call(extern))
大概意思是“任何时候,要么调用的是白名单里的bar,要么不是调用外部函数”。然后用Aorai启动验证,它会自动扫描整个程序,找出违反这个规则的调用。这种方式适合把检查逻辑固化下来,集成到你的自动化验证流水线中。ACSL注解配合WP插件:细粒度的函数级约束
如果你需要对单个函数做更严格的精细化约束,还可以用ACSL注解搭配WP(Weakest Precondition)插件。比如给你的foo函数加个注解,确保它只调用白名单里的外部函数:/*@ ensures \forall call c; \call_target(c) == bar; */ void foo() { bar(); }然后用WP插件验证这个注解,它会检查该函数的所有调用是否符合你设定的规则。这种方式适合对项目中的关键函数做针对性的合规性检查。
总结一下:如果只是快速验证外部函数调用是否符合白名单,CG插件是最省事的选择;如果需要自动化验证或者更复杂的规则约束,Aorai或者ACSL+WP的组合会更合适。
内容来源于stack exchange

