4. 软件安全分级

在医疗软件验证与确认工程中,IEC 62304 是贯穿全生命周期的核心标准。它并不要求所有软件都执行同样强度的 V&V 活动,而是先通过“软件安全分级”把软件划分为 A、B、C 三个等级,再按等级裁剪开发、验证与确认要求。理解这套分级逻辑,是后续制定验证策略、分配测试资源、判断文档深度的前提。

一、分级的判定对象:软件项,而非整个产品

IEC 62304 的分级对象是软件项(software item),而不是整台设备或整个软件系统。一个含软件的医疗器械,可能同时包含多个软件项:例如输液泵的“流速控制模块”和“日志导出模块”,二者失效后果完全不同,应分别定级。因此,实际工作中第一步是完成软件架构分解,识别出可独立评估的软件项,再逐项定级。

分级的依据不是软件规模、复杂度或开发难度,而是软件失效可能导致的危害后果。标准给出的判定准则可归纳为三个递进问题:

  • A 级:软件失效不可能导致伤害,也不可能导致不可接受的健康风险。例如仅用于显示趋势、生成统计报表、非诊断用途的数据导出。
  • B 级:软件失效可能导致非严重伤害(non-serious injury)。例如报警提示延迟但医护人员仍可及时干预,或剂量显示偏差在可纠正范围内。
  • C 级:软件失效可能导致死亡或严重伤害(death or serious injury)。例如放疗剂量控制、呼吸机通气参数闭环控制、除颤能量输出控制。

这里的关键词是“可能导致”。分级不是看历史上是否发生过伤害,而是看失效后果的潜在严重度。如果某软件项失效后,其危害后果的严重度无法被判定为“非严重”,则应保守地归入 C 级。

二、基于风险确定等级:从危害分析到软件项定级

软件安全等级不能凭经验拍定,而应来自风险管理过程。典型路径是:先做系统级危害分析(如 ISO 14971 要求的 FMEA、FTA 或危害清单),识别危害、危害处境和伤害;再分析每个危害的风险控制措施;最后判断哪些风险控制措施由软件承担。若某软件项是某条风险控制链上的关键环节,其失效会直接使该控制措施失效,则该软件项的等级由该危害的严重度决定。

需要特别注意的是:风险控制措施本身也可能引入新的软件风险。例如,为降低“过量输注”风险而增加“软件限速”功能,这个限速软件项一旦失效,反而可能直接导致过量输注,因此它通常应定为 C 级。分级结果应记录在软件安全分级文件中,并随风险管理活动更新而复审。

IEC 62304 软件安全分级判定与 V&V 强度映射 系统危害分析 识别危害 / 危害处境 评估伤害严重度 确定风险控制措施 软件项识别 架构分解 判断是否承担 风险控制措施 失效后果 严重度判定 A 级 不可能导致伤害 V&V:基本验证 + 系统级测试 B 级 可能导致非严重伤害 V&V:单元验证 + 集成 + 系统测试 C 级 可能导致死亡或严重伤害 V&V:全项 + 覆盖度 + 独立验证 不同等级对 V&V 活动的要求强度 A:系统级验证为主 B:单元 + 集成 + 系统 C:全项 + 覆盖度 + 独立验证

三、A、B、C 级对 V&V 活动的具体要求差异

分级结果直接决定软件开发生命周期过程的“必做项”。IEC 62304 对三个等级的要求呈阶梯式递增,核心差异体现在以下方面:

活动领域 A 级 B 级 C 级
软件单元验证 不要求 要求 要求,且需覆盖度分析
软件集成测试 不要求 要求 要求,含接口与集成顺序验证
软件系统测试 要求 要求 要求
代码覆盖率 不要求 不强制 要求语句/分支覆盖,必要时更严
独立验证 不要求 不要求 建议由独立人员或独立团队执行
详细设计文档 不要求 要求 要求,且需可追溯到单元

从表中可见,A 级软件只需保证系统级行为正确,验证重点在“整机功能是否满足预期用途”;B 级开始要求单元和集成层面的验证,确保模块内部逻辑与接口正确;C 级则进一步要求覆盖度分析、详细设计追溯和独立验证,以证明“没有未测试到的关键路径”。

四、实操中的定级与验证策略示例

假设某输液泵软件被分解为三个软件项:流速控制项、报警提示项、历史记录导出项。危害分析显示:流速控制失效可能导致过量输注,严重度为“严重伤害”,故定为 C 级;报警提示失效可能导致医护人员延迟响应,但不会直接造成不可逆伤害,定为 B 级;历史记录导出仅用于事后统计,失效不影响治疗,定为 A 级。

对应的 V&V 策略可设计为:

  • 流速控制项(C 级):对每个单元编写单元测试,要求语句覆盖率 100%、分支覆盖率 100%;执行集成测试验证传感器—控制器—电机驱动接口;系统测试覆盖最大流速、最小流速、阻塞报警、气泡报警等场景;由独立验证人员复核测试用例与结果。
  • 报警提示项(B 级):执行单元测试和集成测试,验证报警触发条件、优先级和显示逻辑;系统测试验证报警在正常和异常工况下均能正确呈现;不强制覆盖率指标,但需保留测试记录。
  • 历史记录导出项(A 级):仅执行系统级测试,验证导出文件格式、字段完整性和时间戳正确性;无需单元测试和集成测试。
实操提示:定级不是一次性的。当软件架构变更、新增风险控制措施或风险管理文件更新时,应重新评估受影响软件项的安全等级。若某软件项从 A 级升为 B 级,原先省略的单元测试和集成测试必须补做,不能仅靠系统测试“兜底”。

五、常见误区与判断边界

实际工作中,分级最容易出现两类偏差。第一类是“就低不就高”:为了减少验证工作量,把本应定为 C 级的软件项归为 B 级。例如,某软件项虽然不直接控制治疗输出,但它负责计算剂量并传给控制模块,一旦计算错误会直接导致过量,这种“间接但关键”的软件项仍应定为 C 级。第二类是“整机一个等级”:把整个产品笼统定为 C 级,导致所有模块都执行最高强度验证,资源浪费严重。正确做法是逐软件项定级,再按等级组合验证策略。

判断边界可以借助一个简单问题:如果该软件项失效,且所有外部风险控制措施都未生效,是否可能导致死亡或严重伤害?若答案是“是”,则定为 C 级;若答案是“可能导致非严重伤害”,定为 B 级;若答案是“不可能导致伤害”,定为 A 级。这个判断必须基于危害分析,而不是开发人员的直觉。

掌握 A、B、C 级分类准则,本质上是在回答“验证做到什么程度才够”。等级越高,V&V 的深度、覆盖度和独立性要求越高;等级越低,越依赖系统级验证和风险管理结论。只有把分级做准,后续的验证计划、测试用例设计和确认活动才有可靠依据。