MISRA 是安全相关嵌入式 C/C++ 开发中广泛采用的编码规范。对于汽车电子等项目,它通过约束容易导致缺陷或不确定行为的语言用法,让代码质量不只依赖开发者的个人经验。
但把 MISRA 用起来,并不是运行一次静态扫描。开发团队还需要解决三个具体问题:**规则怎样检查、违规怎样修复、检查结果怎样跟随代码持续更新。**下面结合返回值处理这一常见场景,看 Parasoft C/C++test 如何支持这些工作。
一条规则,怎样变成可检查的工程任务?
以 MISRA C:2023 Rule 17.7 为例:非 `void` 函数的返回值应被使用。嵌入式驱动常通过返回值报告超时、通信失败等状态,如果调用处直接丢弃结果,代码可能顺利编译,故障却没有得到处理。
/* sensor_read() 仅在返回 SENSOR_OK 时保证输出有效。 */
sensor_sample_t candidate = { 0U, 0U };
sensor_read(&candidate); /* 返回状态被忽略 */
controller_update(&candidate); /* 失败时仍向控制逻辑传递数据 */
这里的问题并不只是“少定义了一个状态变量”。如果读取失败,初始化过的 `candidate` 也不代表有效采样。修复时需要按照接口契约,阻止失败数据进入后续处理:
/* 函数片段:成功才更新输出,失败则保留调用者原有数据。 */
sensor_status_t sensor_acquire(sensor_sample_t *out)
{
sensor_status_t status = SENSOR_E_ARG;
sensor_sample_t candidate = { 0U, 0U };
if (out != NULL) {
status = sensor_read(&candidate);
if (status == SENSOR_OK) {
*out = candidate;
}
}
return status;
}
示例约定 `sensor_sample_t` 为包含两个无符号整数字段的采样结构,`sensor_read()` 同步完成读取,返回 `SENSOR_OK` 时输出有效。调用者仍需检查 `sensor_acquire()` 的返回状态,才能判断本次采样是否可用。
Parasoft C/C++test 可按项目选定的 MISRA 规则配置分析代码,将违规关联到具体规则和代码位置。工程师据此定位调用点,再核对函数声明、输出参数和失败分支。
需要区分的是:发现“返回值未使用”,不等于已经判断出故障后果;把返回值赋给变量,也不等于失败分支已正确处理。显式转换为 `void` 可以表达有意丢弃返回值,但不能证明忽略这个错误状态是合理的。

检查配置同样影响结论。团队需要明确 MISRA 版本、适用源码及启用规则,并使分析使用的条件编译宏、头文件和编译器配置与交付构建相匹配。例如,产品宏切换后才启用的驱动分支,如果没有进入分析范围,就不能因为扫描结果中没有告警而认为已经检查。
Parasoft 的指南执行计划可帮助团队核对 MISRA 指南与工具检查规则的对应关系;工具无法充分判定的内容,仍需安排人工审查。
规则检查怎样跟上代码迭代?
Parasoft 官方的 Ribbit 案例展示了编码规范进入研发流程的方式。这家自主航空软件团队将 C/C++test 的 MISRA 等规则检查接入开发环境和 CI,在开发、提交过程中获得反馈,持续发现新代码触发的规则问题。
对于已有代码,可以先识别初次扫描中的违规并建立基线,再对新增违规设置控制要求,逐步处理历史问题。这样,团队能够区分“原来就有的问题”和“本次修改引入的问题”,避免只看告警总数。
| 检查环节 | 重点关注 |
| 开发阶段 | 新增调用是否忽略返回值,失败分支是否遗漏 |
| CI 检查 | 使用统一规则配置,识别相对基线的新增违规 |
| 修复复查 | 重新执行规则检查,并运行相关异常路径测试 |
建立基线是为了管理存量问题,不表示旧违规已经获准保留。规则配置和构建条件发生变化时,也需要评估前后结果是否仍具有可比性。
发现告警后,怎样支撑合规判断?
仍以前述返回值告警为例,修改代码后应使用相同分析配置重新检查,并通过测试桩模拟驱动失败,验证以下行为:
| 测试条件 | 应验证的结果 |
| 读取成功 | 输出更新为本次采样,返回成功状态 |
| 读取超时或通信失败 | 错误状态向上传递,输出字段保持原值 |
| 驱动部分写入后返回失败 | 部分结果不写入调用者输出 |
| 输出指针为空 | 返回参数错误,不调用驱动 |
这类测试应同时检查返回状态和输出数据。只断言“返回了超时”,无法确认失败数据没有被发布;只检查输出,也可能遗漏错误状态被吞掉的问题。C/C++test 的单元测试与覆盖率能力可用于支持相关验证,帮助团队检查故障处理路径是否实际执行。
告警消失说明相应规则问题已得到处理;故障路径测试进一步验证错误处理是否符合需求。两者提供不同层面的依据,需要结合使用。
如果告警属于误报,团队要保留调查依据;如果确有理由保留真实违规,则应评估影响、限定适用范围,并按项目流程取得批准。在工具中抑制告警,不等于完成正式偏离审批。
在相应版本、授权和合规扩展配置下,Parasoft DTP 的 MISRA 合规报告可呈现指南检查、违规与偏离状态,并帮助核对计划中的指南是否得到相应检查。团队因此可以追踪规则是否执行、问题如何处理,而不只看告警数量。

Parasoft 帮助企业落实 MISRA 的核心价值,是让选定的编码指南持续作用于实际代码,并使检查范围、违规位置和处理结果可供核查。从规则检查到故障验证,再到报告汇总,团队可以把合规要求落实为日常开发中的具体任务。
这里是慧都科技,助力产品智能化,欢迎沟通交流,如有任何问题,可以评论私信~

网硕互联帮助中心




评论前必须登录!
注册