关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | strongerHuang
好久都没关注 IAR 的动态了,今天看了一下,IAR EWARM最新版本都是V10.10 了,但没有企业邮箱,下载不了。

IAR在众多MCU开发工具中,工具链算是比较丰富的一款。比如:C-Trust、IAR Connect、C-SPY、C-RUN、C-STAT、I-jet、I-jet Trace、I-scope等。
其中,本文讲述的 C-STAT 静态和 C-RUN 动态代码分析工具就是典型且实用的工具。
一、概述
1、C-STAT 静态分析工具:在静态不运行代码的情况下,对 C/C++ 源代码进行扫描,检查是否符合 MISRA、CERT、CWE 等编码标准,旨在尽早发现潜在的代码缺陷、安全漏洞以及编码标准偏差。
核心作用:帮助开发者遵循 MISRA C/C++、CERT C/C++、CWE 等行业编码标准,提升代码的规范性与安全性。
主要检查内容:能发现潜在的缓冲区溢出、算术与转换问题、未定义行为、堆管理的时序属性等。
主要优势:无需运行代码,可在开发初期(编码阶段)即介入,对性能无影响,且能检查到未被执行到的代码路径。
IAR C-STAT 集成到了 IAR Embedded Workbench 和 IAR 构建工具中。同时,还经 TÜV SUV认证,符合多种功能安全标准。
更多相关内容可以参看官网介绍:
https://www.iar.com/zh/embedded-development-tools/iar-c-stat

2、C-RUN 运行时分析工具:在程序运行时监控执行,通过向程序中注入检测代码或替换库函数,在程序实际运行时监控执行状态,用于检测只有在特定条件下才会触发的错误。比如:检测算术错误、数组越界、堆内存泄漏等动态问题。
核心作用:发现静态分析难以捕捉的运行时错误,如缓冲区溢出、内存泄漏、边界问题等。
主要检查类型:
算术检查:整数溢出、除零、错误的移位操作、隐式类型转换导致的值改变等。
边界检查:通过指针进行的访问是否超出所指向对象的边界。
堆检查:内存泄漏、堆完整性(如双重释放)等。
主要优势:误报率极低,因为报告的都是真实发生过的错误。它完全集成于 IDE,开箱即用,检测时能提供精确的调用栈信息。
更多相关内容可以参看官网介绍:
https://www.iar.com/zh/embedded-development-tools/iar-c-run

二者区别:
| C-STAT (静态) | C-RUN (动态) | |
|---|---|---|
| 分析对象 | ||
| 工作原理 | ||
| 触发时机 | ||
| 优势 | 误报率极低 | |
| 局限性 |
在实际项目中,通常会将两者结合使用:利用 C-STAT 在编码阶段守住底线,再用 C-RUN 在测试阶段验证实际运行的稳定性,从而形成更完整的代码质量保障。
二、用法
1、C-STAT 的用法
C-STAT 的核心用法是在代码提交或编译前,对源代码进行规则扫描,实现“左移”的质量控制。
IDE 内即时检查:开发者在 IAR Embedded Workbench 中完成一个函数或模块后,可立即通过 Project > C-STAT Static Analysis > Analyze Project 对当前文件或整个项目进行分析。结果会显示在 C-STAT Messages 窗口中,双击即可跳转到问题代码行。这种即时反馈机制鼓励开发者在编码过程中就修复问题,避免缺陷累积。
处理误报与例外:对于第三方代码或自动生成的代码,无需分析。可以通过 pragma 指令(如 cstat_disable)在特定代码行或函数级别抑制某些检查,提升分析效率。
CI/CD 自动化集成:在持续集成流水线中,使用命令行工具 iarbuild.exe -cstat_analyze 即可对项目执行静态分析。典型做法是在夜间构建中自动运行,并通过 ireport.exe 生成 HTML 报告,用于监控代码质量趋势。这确保了新提交的代码不会引入新的规则偏差。

2、 C-RUN 的用法
C-RUN 的核心用法是在调试会话或测试运行中,监控代码的实际执行路径,捕捉只有在特定条件下才会触发的运行时错误。
调试会话中的交互式检查:在 IAR IDE 中启用所需的运行时检查选项(如边界检查、算术检查)后,重新构建项目并启动调试。当 C-RUN 检测到错误(如整数溢出或数组越界)时,程序会暂停执行,并在 C-RUN Messages 窗口中显示详细的调用栈信息。开发者可以据此定位并修复问题,然后重新运行。
过滤已知问题:对于已知但不影响功能的运行时消息(如特定的类型转换),可以利用 C-RUN Messages Rules 窗口创建规则来忽略特定消息,使其不再中断调试,或仅记录而不停止执行。
脱离调试器的现场测试:这是 C-RUN 在复杂系统中的重要用法。通过修改链接器选项,将 C-RUN 错误报告函数重定向到 UART 或终端 I/O,便可在没有调试器(ICE)连接的情况下,将程序部署到实际硬件上进行长期运行测试。捕获到的原始数据可以在事后通过 cspybat.exe 工具进行解析,用于分析偶发性故障。
典型的项目工作流:
编码时:启用 C-STAT,配合 IDE 即时分析,确保代码符合 MISRA 等规范。
日常调试:开启 C-RUN 的算术和边界检查,在调试器中逐模块验证功能,捕获逻辑错误。
系统测试:在功能测试阶段,开启 C-RUN 的堆检查,将消息重定向到日志或终端,进行长时间运行测试,排查内存泄漏等问题。
持续集成:在每日构建中集成 C-STAT 分析,生成报告,作为考核代码质量重要的一环。
------------ END ------------