3、危害分析与风险评估(HARA)

HARA,全称 Hazard Analysis and Risk Assessment。说白了,就是回答三个问题:系统哪里会出问题?出问题后果多严重?我们该用多高的安全等级去防?

我刚开始做功能安全那几年,总觉得 HARA 就是走个过场,填几张表完事。直到有一次,一个座舱的黑屏问题在客户路试时差点引发事故……嗯,从那以后,我再也不敢轻视 HARA 了。它是整个安全开发的基石,地基没打好,后面全是白干。

3.1 HARA 方法论:从 ISO 26262 到智能座舱

ISO 26262 第三部分明确要求:所有可能引发危害的功能,都必须做 HARA。智能座舱虽然不像刹车、转向那么直接关乎生命,但想想看——导航突然黑屏、车速显示错误、报警声被音乐覆盖——这些都可能间接导致驾驶员误操作或分心,进而引发事故。

我个人习惯把 HARA 拆成四个步骤:

  1. 场景定义——搞清楚车在什么情况下运行
  2. 危害识别——找出所有可能出错的点
  3. 风险评估——评估每个危害的严重度、暴露率、可控性
  4. ASIL 定级——算出安全等级,决定后续开发投入

核心原则:HARA 不是一次性工作。每次功能变更、新增场景、法规更新,都要重新审视。我见过太多项目因为「改个小功能懒得重做 HARA」,最后在认证时被审计师问住。

3.2 运行场景定义:别在实验室里想当然

场景定义是 HARA 的第一步,也是最容易被忽略的一步。很多人坐在办公室里,凭想象列几个场景就完事了。我建议你:去跟测试工程师、标定工程师、甚至客户路试司机聊一聊。他们见过的真实场景,比任何标准都丰富。

智能座舱的典型运行场景至少包括:

  • 高速巡航——120km/h,驾驶员注意力集中在前方
  • 城市拥堵——走走停停,驾驶员频繁操作中控
  • 夜间行驶——屏幕亮度自动调节,HUD 信息投射
  • 极端天气——暴雨、大雾、高温、低温
  • 充电/停车——车辆静止,娱乐系统全功率运行
  • OTA 升级——系统后台更新,部分功能暂时不可用

避坑指南:我曾经在一个项目中,只定义了「正常驾驶」和「停车」两个场景。结果路试时发现,车辆在隧道内 GPS 信号丢失,导航直接卡死。隧道场景我们根本没考虑。从那以后,我要求团队必须列出至少 10 个场景,并且每个场景都要有「正常模式」和「故障模式」两个子状态。

3.3 危害识别:把「不可能」变成「可能」

危害识别,说白了就是假设一切都会坏。屏幕会黑、喇叭会破音、触控会失灵、网络会断。你想想看,如果这些同时发生,驾驶员会怎样?

我常用的方法是功能失效分析(FMEA)和头脑风暴。把功能安全工程师、系统工程师、软件工程师、硬件工程师、测试工程师叫到一个房间,对着功能清单一条条过:

  • 这个功能如果失效,最坏后果是什么?
  • 这个功能如果误动作,最坏后果是什么?
  • 这个功能如果部分失效,最坏后果是什么?

举个例子,智能座舱的「车速显示」功能:

功能 失效模式 潜在危害
车速显示 显示值比实际低 20km/h 驾驶员超速,引发追尾或违章
车速显示 显示值比实际高 20km/h 驾驶员龟速行驶,引发后车追尾
车速显示 完全黑屏 驾驶员分心查看手机导航,偏离车道
车速显示 闪烁/跳动 驾驶员视觉疲劳,注意力下降

注意:危害识别不要只盯着「直接失效」。间接危害往往更隐蔽。比如,座舱的语音助手误唤醒,突然播放音乐,可能掩盖了外部报警声(如后方来车提示)。这种「功能间干扰」在智能座舱里非常常见。

3.4 风险评估:三个维度,一个公式

ISO 26262 把风险评估拆成三个维度:

  • S(Severity)严重度——伤害有多重?轻伤、重伤、致命?
  • E(Exposure)暴露率——这个场景发生的概率高不高?
  • C(Controllability)可控性——驾驶员能不能在失效时自己救回来?

每个维度分 0~3 或 0~4 级。然后查表得出 ASIL 等级:

S E C ASIL
3(致命) 3(高) 3(不可控) ASIL D
3(致命) 2(中) 2(难控) ASIL C
2(重伤) 3(高) 2(难控) ASIL B
1(轻伤) 2(中) 1(可控) ASIL A
0(无伤害) — — QM

举个例子。智能座舱的「导航黑屏」:

  • S:高速上突然黑屏,驾驶员可能急打方向或急刹车,导致追尾或侧翻 → S=3
  • E:导航黑屏在高温暴晒下概率不低,每年可能遇到几次 → E=2
  • C:驾驶员可以靠路牌和手机导航继续行驶,但需要时间反应 → C=2

查表:S3+E2+C2 = ASIL C。这意味着,导航系统的软件开发必须按照 ASIL C 的要求来——包括代码覆盖率、测试深度、安全机制设计等。

我的经验:很多团队在评估 C(可控性)时会过于乐观。总觉得「驾驶员能反应过来」。但你要知道,在高速上 120km/h,1 秒就是 33 米。驾驶员从「发现异常」到「做出正确反应」,平均需要 2~3 秒。这期间车已经跑出去近百米了。所以,可控性评估一定要保守。

3.5 ASIL 等级确定:从 QM 到 ASIL D

ASIL 等级决定了后续开发的安全投入。等级越高,要求越严:

ASIL 安全目标 开发要求 典型座舱功能
QM 无安全要求 常规质量管理 空调温度显示、座椅记忆
ASIL A 低风险 基本安全流程 音量调节、氛围灯
ASIL B 中等风险 中等安全流程 导航地图、媒体播放
ASIL C 高风险 严格安全流程 车速显示、报警提示音
ASIL D 极高风险 最严格安全流程 制动辅助、转向控制(座舱一般不涉及)

这里有个关键点:ASIL 等级可以分解。比如一个 ASIL C 的功能,可以拆成两个 ASIL B 的子系统,只要它们相互独立、互不干扰。这就是所谓的「ASIL 分解」或「安全分解」。我在项目中经常用这招来降低单个模块的开发成本。

避坑指南:我曾经在一个项目中,把 ASIL C 的「车速显示」分解成「车速采集(ASIL B)」和「车速显示(ASIL B)」。结果审计师问:如果采集模块和显示模块跑在同一个 MCU 上,它们真的独立吗?嗯,这个问题问得好。ASIL 分解的前提是自由干扰(FFI)——两个模块之间不能互相影响。如果共享内存、共享中断、共享电源,那分解就无效。所以,分解之前,先做 FFI 分析。

3.6 HARA 输出:安全目标与安全状态

HARA 的最终输出是安全目标(Safety Goal)和安全状态(Safe State)。

  • 安全目标:针对每个危害,定义「系统必须做什么来避免危害」。比如,「车速显示误差不得超过 ±5km/h」。
  • 安全状态:当系统检测到故障时,应该进入什么状态。比如,「车速显示故障时,显示 '---' 并点亮报警灯」。

安全目标必须可验证、可测试。不能写「系统要安全」,要写「当车速传感器故障时,系统在 100ms 内切换到备用传感器,并显示故障图标」。

下面是我常用的 HARA 流程框架图,帮你把整个逻辑串起来:

HARA 流程框架图 功能定义 运行场景定义 危害识别 风险评估(S/E/C) ASIL 等级确定 关键输入 • 功能清单 • 场景列表 • 失效模式 • S/E/C 评分 关键输出 • 安全目标 • 安全状态 • ASIL 等级 • 安全机制需求 注:HARA 是迭代过程,每次功能变更需重新评估

3.7 小结:HARA 不是文档,是决策工具

很多团队把 HARA 当成「交差用的文档」。写完了,锁进文件夹,再也没人看。这是最大的浪费。

我个人习惯把 HARA 当成安全开发的路线图。每次做设计决策、写代码、做测试,都回头翻翻 HARA:这个功能的安全目标是什么?ASIL 等级是多少?安全状态怎么触发?

记住一句话:HARA 的质量,决定了整个功能安全开发的成败。花在 HARA 上的时间,永远不会白费。