4. 软件安全级别与审查策略
在医疗器械软件设计审查中,最忌讳的做法是对所有软件模块采用同一套审查深度。一个负责驱动输液泵电机的控制模块,与一个仅用于显示设备序列号的界面模块,其失效后果相差悬殊。如果对前者审查不足,可能放过致命缺陷;如果对后者过度审查,则浪费大量工程资源。因此,审查工程的第一项决策就是:根据软件失效可能造成的风险,为每个软件项确定安全级别,并据此分配审查资源。
一、A、B、C三级的基本判定逻辑
医疗器械软件的安全级别通常依据两个维度判定:失效后果的严重程度和失效发生的可能性。在审查实践中,更常用的是基于“软件失效是否可能导致不可接受的风险”来划分:
- A级(高安全级别):软件失效可能导致患者或操作者死亡或严重伤害。例如:放疗剂量控制、输液泵流速调节、呼吸机通气参数控制、除颤能量释放控制。
- B级(中安全级别):软件失效可能导致轻微伤害,或需要医疗干预才能避免伤害。例如:监护仪报警阈值计算、诊断图像后处理、非关键参数显示。
- C级(低安全级别):软件失效不会导致伤害,仅影响使用体验或非关键数据记录。例如:设备使用日志记录、界面主题切换、非诊断性数据导出。
需要特别强调的是:安全级别不是对整个产品“一刀切”。同一台设备中,不同软件项可以有不同的安全级别。审查计划必须细化到软件项或软件单元级别,而不是停留在产品级。
二、差异化审查计划的核心维度
确定级别后,审查计划需要在以下维度上做出差异化设计:
| 审查维度 | A级 | B级 | C级 |
|---|---|---|---|
| 需求审查 | 逐条追溯至风险控制措施,验证完整性 | 关键需求追溯,抽样验证 | 形式检查,确认无安全相关需求 |
| 设计审查 | 架构评审+详细设计评审+独立复核 | 架构评审+关键模块详细评审 | 设计文档完整性检查 |
| 代码审查 | 100%代码走查+静态分析+独立验证 | 关键模块100%,其余抽样30%~50% | 静态分析+抽样10%~20% |
| 测试验证 | 单元+集成+系统+边界+故障注入 | 单元+集成+系统+关键边界 | 系统功能测试 |
| 追溯性 | 需求-设计-代码-测试全链路双向追溯 | 关键链路追溯 | 基本追溯 |
这张表是审查计划设计的骨架。实际执行时,还需要根据软件项的具体功能、复杂度和失效模式进一步细化。
三、抽样策略:不是随机抽,而是风险驱动抽
对于B级和C级软件项,不可能也不需要对所有代码和所有路径进行100%审查。抽样策略必须遵循风险驱动原则,而不是简单随机抽样。具体做法是:
- 识别高风险区域:与安全相关的输入输出、边界条件处理、异常处理、状态机跳转、中断服务程序、通信协议解析。
- 强制覆盖高风险区域:这些区域必须100%审查,不参与抽样。
- 对剩余区域分层抽样:按模块复杂度、变更频率、历史缺陷密度分层,复杂度高或近期变更的模块提高抽样比例。
- 记录抽样依据:每个被抽中的样本应说明为何被选中,未抽中的区域应说明风险可接受的理由。
四、验证强度:从“测过”到“证明足够安全”
验证强度不仅取决于测试用例数量,更取决于测试设计的严格程度。A级软件项的验证必须能够回答:“如果软件失效,风险控制措施是否仍然有效?”因此需要引入故障注入测试和边界值强制覆盖。B级软件项重点验证关键功能路径和异常处理。C级软件项以功能确认和回归测试为主。
验证强度的另一个体现是独立验证。A级软件项的关键模块应由未参与开发的独立人员执行审查和测试,避免“自己查自己”的盲区。B级软件项可由同团队不同成员交叉验证。C级软件项可由开发人员自测加同行抽查。
五、审查计划与抽样策略的联动关系
安全级别决定了审查计划的整体框架,而抽样策略和验证强度是审查计划在资源约束下的具体落地方式。三者之间的关系可以用下面的SVG来直观表达:
六、审查计划落地时的常见误区
误区一:级别定完就束之高阁。安全级别应随设计变更动态调整。如果B级模块新增了与安全相关的功能,必须重新评估级别并升级审查计划。
误区二:抽样变成“抽熟人”。抽样必须基于风险分层,不能因为某个模块代码写得漂亮就少查,也不能因为某个开发人员资历浅就多查。抽样对象是代码和设计,不是人。
误区三:验证强度只看用例数量。100个只覆盖正常路径的用例,不如20个覆盖边界和异常路径的用例。A级软件项的验证必须包含“如果这里失效,风险控制是否还成立”的追问。
总结来说,A、B、C三级不是标签,而是审查资源的分配依据。级别越高,审查越深、抽样越密、验证越严、独立性越强。审查工程师的核心能力,就在于把有限的审查资源精准投放到真正影响患者安全的地方。