單元 10 · SWE.3 詳細設計與單元建置

詳細設計文件、MISRA C、defensive programming

10.1 SWE.3 在做什麼

SWE.3 軟體詳細設計與單元建置:把架構元件細化成單元(Unit)的詳細設計,再用程式碼實作。交付物:詳細設計文件 + 可編譯、可測試的程式碼

對應 ISO 26262:Part 6 對軟體實作要求編碼規範可理解性可測試性防禦式設計

10.2 詳細設計的內容

範例
單元:TTC_Calculator
介面:
  輸入:obj_dist_m(float32)、obj_vrel_mps(float32)
  輸出:ttc_ms(uint32)、valid(bool)
行為:ttc = dist / vrel;vrel < 1 m/s 時視為靜止,
      設定 valid=false(不輸出 TTC)。

10.3 編碼規範:MISRA C 一瞥

MISRA C 是車用 C 語言的編碼規範,用來減少系統性錯誤。常用規則:

規則類型例子
型別安全禁止隱含轉型(如 int→uint32 未檢查)
控制流禁止 goto、禁止 fall-through
表達式禁止副作用與未定義行為
指標禁止多重指標(部分設定)
MISRA 對照
// 不良:隱含轉型 + 未檢查除數
ttc_ms = (uint32_t)(dist / vrel);

// 改善:檢查除數 + 明確轉型
if (vrel < 1.0f) {
    ttc_ms = 0u;
    valid  = false;
} else {
    ttc_ms = (uint32_t)((dist / vrel) * 1000.0f);
    valid  = true;
}

10.4 防禦式程式設計

實務陷阱:防禦式設計會增加程式碼,需用靜態分析工具(如 Polyspace、Cppcheck)輔助,並在 SWE.4 用測試證明。

10.5 Worked Example:完整單元

範例
// ttc_calculator.c(ASIL D)
bool ttc_calc(float dist, float vrel, uint32_t* ttc_ms, bool* valid) {
    if (ttc_ms == NULL || valid == NULL) return false;
    if (dist  < 0.0f || dist > 200.0f)   return false;
    if (vrel  < 0.0f || vrel > 100.0f)   return false;
    if (vrel < 1.0f) {                    // 靜止物體
        *ttc_ms = 0u; *valid = false; return true;
    }
    *ttc_ms = (uint32_t)((dist / vrel) * 1000.0f);
    *valid  = true;
    return true;
}
// 對應 SWR-AEB-011;SWE.4 需 UT 覆蓋(見單元 11)

動手:挑一個你程式中的函式,用 MISRA 風格 + 防禦式設計重寫,並列出你用的規則。

10.6 深入原理:詳細設計要讓錯誤被看見

SWE.3 的品質不只看程式能不能編譯,也看設計是否能被審查、實作是否能被測試。防禦式設計把輸入、範圍、溢位、失敗回傳與狀態轉移明確化;編碼規範則降低未定義行為與不同編譯器解讀差異。安全相關函式應避免隱藏副作用,對錯誤採取一致策略,並讓每個防護分支都有對應測試與追溯。

設計檢查問題證據
介面NULL、範圍、所有權是否清楚?設計規格、靜態分析
數值溢位、精度、單位是否明確?邊界測試、型別規則
錯誤失敗後輸出與狀態是否安全?故障注入、單元測試

10.7 Worked Example:從除法風險到可測試設計

範例
風險:vrel=0 時計算 dist/vrel,可能例外或產生無效值。
設計決策:先驗證指標與範圍;vrel < 1.0 m/s 定義為靜止;
輸出 ttc_ms=0、valid=false,呼叫端不得把無效值當成碰撞時間。
測試集合:NULL、負值、最大值、0.999、1.000、正常速度,
並檢查每個結果都能對應 SWR 與詳細設計決策。

10.8 練習

  1. 挑一個函式,列出至少四個輸入邊界與預期錯誤反應。
  2. 找出一個可能的隱含轉型或溢位,寫出明確型別策略。
  3. 把一個「return false」補成可追蹤的錯誤碼與測試案例。

10.9 交付物檢查清單

對安全函式,審查者應能從設計決策直接找到程式實作,再找到驗證案例。若只能靠作者口頭解釋,代表設計與程式的介面仍然太隱晦。

看完這單元你應該能說出:
  • 撰寫軟體詳細設計(單元層級)。
  • 套用編碼規範(MISRA C)與防禦式設計。
  • 列出 SWE.3 的常見交付物與檢查點。

延伸閱讀

10.A 進階真實情境 Worked Example

進階範例:ASIL D 軟體的獨立安全驗證(ISA)
驗證目標:車速計算模組(ASIL D)的軟體獨立安全驗證。

┌─ ISA 驗證計畫 ────────────────────────────────────────────┐
│ 1. 驗證範圍:                                             │
│    • 軟體架構設計是否符合安全需求                          │
│    • 軟體單元測試是否達到 MC/DC 覆蓋率                    │
│    • 靜態分析是否遵循 MISRA C:2012                        │
│    • 故障注入測試是否覆蓋所有安全機制                      │
│                                                           │
│ 2. 獨立性要求:                                           │
│    • ISA 執行團隊 ≠ 開發團隊(組織獨立)                  │
│    • ISA 工具 ≠ 開發工具(工具獨立)                      │
│    • ISA 環境 ≠ 開發環境(環境獨立)                      │
│                                                           │
│ 3. 驗證方法:                                             │
│    • 文件審查(Design Review)                            │
│    • 程式碼審查(Code Review)                            │
│    • 測試執行(Test Execution)                            │
│    • 故障注入(Fault Injection)                           │
├─ 執行結果 ────────────────────────────────────────────────┤
│ 1. 文件審查:                                             │
│    • 發現 3 處需求追溯遺漏 → 已修正                      │
│    • 發現 1 處安全機制覆蓋不足 → 已補強                  │
│                                                           │
│ 2. 程式碼審查:                                           │
│    • 發現 5 處 MISRA 違規 → 已修正                       │
│    • 發現 2 處效能瓶頸 → 已優化                          │
│                                                           │
│ 3. 測試執行:                                             │
│    • 複測覆蓋率:MC/DC = 100%                             │
│    • 故障注入:100% 安全機制觸發成功                      │
│                                                           │
│ 4. 結論:通過 ISA,無 Severity 1/2 殘留問題              │
└────────────────────────────────────────────────────────────┘

10.B 深入原理擴充

ISO 26262 Part 8 §11 要求「獨立安全驗證」(Independent Safety Validation) 的獨立性程度取決於 ASIL 等級:ASIL D 要求最高獨立性(組織、工具、環境三重獨立)。

關鍵概念:「驗證」(Verification)vs「確認」(Validation)。 驗證回答「產品是否正確地構建?」(Are we building the product right?), 確認回答「是否構建了正確的產品?」(Are we building the right product?)。 ISO 26262 的 ISA 是驗證——確認設計實現符合安全需求;而 ASPICE 的 SWE.4/SWE.5 則涵蓋驗證與確認兩個面向。

10.C 診斷式疑難排解表

症狀可能原因解決方案
ISA 獨立性不足驗證團隊與開發團隊有共同 KPI建立獨立的 ISA 團隊組織架構,KPI 與開發團隊分離
ISA 發現的問題修正後未複驗缺乏修正後的複驗機制所有 ISA 發現問題修正後,必須執行迴歸測試並由 ISA 團隊複驗
ISA 報告格式不一致缺乏統一的 ISA 報告模板建立標準化的 ISA 報告模板,含發現、嚴重等級、修正狀態、複驗結果

10.D 進階挑戰題

  1. 設計一個完整的 ISA 計畫,涵蓋車速計算模組的所有安全相關活動。
  2. 若 ISA 發現一個 Severity 1 的問題(安全機制失效),安全經理應如何處理?列出完整的事件響應流程。
  3. 比較 ISO 26262 Part 8 §11 與 ASPICE SWE.4 在軟體驗證要求上的異同。