如何高效用Frama-C分析IoT大型程序及模块导入问题
Frama-C分析IoT程序常见问题解答
1. Frama-C能否高效分析IoT操作系统这类大型程序?
Frama-C可以分析IoT操作系统这类大型程序,但得做针对性优化。这类系统多包含大量硬件相关代码、并发逻辑和轻量内核模块,直接全量分析会因为代码规模大、依赖复杂导致效率拉胯。建议这么做:
- 采用模块化分析,分模块逐步验证,不要一口吃个胖子
- 用Frama-C的抽象模型替代真实硬件驱动,减少无关代码干扰
- 启用增量分析,只重新分析修改过的模块
- 结合
-light模式,砍掉不必要的分析步骤,提升速度
2. 解决头文件报错,无需编译仅导入单个模块分析的方法
你遇到的thread.h找不到的错误,是因为Frama-C解析代码时定位不到依赖的头文件。要仅导入单个模块(比如thread.c)且不用编译,按以下步骤来:
- 指定头文件搜索路径:用
-I参数添加头文件所在目录。假设thread.h在RIOT-master/core/include下,执行命令:frama-c-gui -I /home/vboxuser/Downloads/RIOT-master/core/include /home/vboxuser/Downloads/RIOT-master/core/thread.c - 跳过未解析的依赖:如果有些头文件确实拿不到,用
-no-frama-c-stdlib避免标准库冲突,或者用-cpp-extra-args传预编译宏,屏蔽不需要的依赖代码。比如:frama-c-gui -I ./include -cpp-extra-args="-DNO_HARDWARE_DRIVER" thread.c - 新手优先用头文件路径法:AST导入模式适合有经验的用户,新手先把上面的方法搞明白就行。
3. 如何仅导入特定模块开展分析?
要聚焦特定模块分析,核心是控制Frama-C的代码范围和依赖加载:
- 只传目标源文件:命令行直接丢需要分析的单个或几个模块文件,别传整个项目目录。比如只分析
thread.c和sched.c:frama-c-gui -I ./include thread.c sched.c - 隔离模块依赖:用预编译宏屏蔽模块里调用的其他未分析代码。比如
thread.c调用了没导入的uart.c函数,加个宏让Frama-C把这些函数当外部未定义函数处理:frama-c-gui -I ./include -cpp-extra-args="-D__UART_FUNCTIONS_EXTERNAL__" thread.c - 用切片功能裁剪代码:通过Frama-C的
-slice插件,基于特定函数或属性剪代码,只留和分析目标相关的部分。比如只分析thread_create函数相关的代码:frama-c-gui -I ./include -slice-function thread_create thread.c -then-on 'Sliced' -print
额外实用建议
- 先从小型模块练手,摸透Frama-C的基本命令和流程再碰大型模块
- 多查
frama-c -help,尤其是预处理、依赖处理相关的选项 - IoT系统里的硬件相关代码,自己写抽象桩函数替代真实驱动,能大幅降低分析难度
附:执行frama-c-gui时的错误日志
root@nirnai:/home/vboxuser# frama-c-gui Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The connection is closed (g-io-error-quark, 18) (frama-c-gui:2821): dconf-WARNING **: 16:22:40.318: failed to commit changes to dconf: The connection is closed /home/vboxuser/Downloads/RIOT-master/core/thread.c:29:10: fatal error: thread.h: No such file or directory 29 | #include "thread.h" | ^~~~~~~~~~ compilation terminated. (frama-c-gui:2821): dconf-WARNING **: 16:22:50.987: failed to commit changes to dconf: The connection is closed
内容的提问来源于stack exchange,提问作者Nirnai Rai
相关产品推荐
相关产品推荐

