隨著汽車行業加速邁向高度互聯和自動駕駛時代,嵌入式軟件開發中網絡安全的重要性空前凸顯。那么,如何為汽車網絡安全選擇合適的編程語言?
本文將探討編程語言的選擇如何影響汽車系統的網絡安全和軟件質量,并評估八種主流編程語言——C、C++、Java、Kotlin、Python、C#、JavaScript 和 Rust——在 AUTOSAR 平臺及安全關鍵型開發環境下的適用性。
汽車安全標準考量
現代汽車是高度復雜、由軟件驅動的系統。隨著系統復雜性的增加,攻擊面也不斷擴大,使得網絡安全成為重中之重。根據Perforce 《汽車軟件開發報告》,安全問題連續多年位列開發者最關注的三大問題之一。
為應對這些挑戰,開發者必須遵循 ISO/SAE 21434 等標準,該標準規范了道路車輛的網絡安全工程。盡管 ISO 25010 軟件質量模型中定義的通用軟件質量特性并非強制要求,但它們對汽車軟件依然具有相關性。然而,2025 年的報告中有 22% 的受訪者指出,滿足此類標準的安全要求既困難又耗時。
因此,為汽車網絡安全選擇編程語言時,需要充分考慮標準要求。編程語言在滿足這些標準方面起著關鍵作用,其影響范圍涵蓋模塊化、抽象化能力乃至抵御漏洞的韌性等方方面面。
ISO/SAE 21434:網絡安全工程
ISO/SAE 21434 是一項較新的汽車標準,用于管理道路車輛電子系統的網絡安全風險。盡管該標準出臺時間不長,但根據 2025 年Perforce《汽車軟件開發報告》,79% 的受訪者所在企業已被要求遵守 ISO/SAE 21434標準。
該標準對軟件開發提出了明確要求,包括分析軟件是否存在固有弱點,以及整體在網絡安全需求方面的一致性、正確性和完整性。它還列出了選擇編程語言時應考慮的標準,例如安全設計和編碼技術,以及明確的語法與語義定義。
此外,它還包含語言本身未涉及的語言標準。這可以通過多種方式實現。最常見的方式是使用定義語言安全子集的編碼標準。例如,C語言最常使用 MISRA C 規范。MISRA C 定義了基本的類型系統,以防止C語言中與隱式類型轉換相關的問題。這是強類型(strong typing)系統的典型示例。
您可以借助Perforce QAC和Klocwork等靜態分析工具,輕松檢查代碼是否符合編碼規范。
在本文對比中,我們采用以下術語來概括編程語言的特性:
- 語言(Language):指語言標準的質量,即是否對任意程序的語法正確性和語義有清晰定義。
- 特性(Features):指語言功能的豐富程度,可以支持現代編程范式,方便編寫安全可靠的軟件。
- 指導(Guidance):指支持該語言的文檔和工具的可用性,包括編碼規范和靜態分析工具。
- 集成(Integration):指該語言編寫的程序與其他語言編寫的程序交互的難易程度。
- 韌性(Resilience):指是否具備防止語言被不當使用的方法,這是語言工具鏈和靜態分析工具保護的結合。
ISO 25010:軟件質量模型
ISO 25010 定義了 8 項質量特性和 31 項子特性。
編程語言需要提供相應功能,以便開發者能夠開發出具備這些質量特性的軟件。
“安全性”是其中一項特性,但需要評估所有質量特性在多大程度上被編程語言所支持。對于實時應用而言,“功能適用性”和“性能效率”同樣重要。
此外,對于汽車項目而言,“可維護性”非常重要,因其高度依賴組件復用;“可移植性”也十分關鍵,以便能夠輕松適配新的硬件。
AUTOSAR 平臺
AUTomotive Open System ARchitecture(AUTOSAR,汽車開放系統架構)旨在標準化并確保基礎軟件元件、接口和總線系統的未來適應性,以幫助整車廠在控制成本的同時,管理日益增長的系統復雜性。
其中,Classic Platform API 面向具有嚴格實時要求和安全關鍵性的車輛功能,使用 C 語言定義;而面向聯網與自動駕駛的新一代 Adaptive Platform API 則使用 C++語言。不過,Adaptive Platform 明確支持引入其他語言的綁定。
接下來,除了 C 和 C++,我們還將綜合評估其他主流的編程語言——Python、Java、C#、JavaScript、Go 和 Rust,共同分析這些語言的質量特性,以及如何緩解其潛在缺陷。
不同編程語言的評估
原生語言(Native Languages)
原生語言被編譯為目標代碼,可直接在目標機器上執行。按初始發布日期排序,這些語言依次包括 C、C++、Rust 和 Go。
C 和 C++
原生執行存在安全與可靠性隱患:程序錯誤可能導致崩潰,安全漏洞也可能被利用。ISO 維護著 C 和 C++ 的語言標準,標準中明確規定了問題行為。C 和 C++ 可能表現出多種未定義行為(例如使用未初始化的數據、空指針解引用或緩沖區溢出)。
幸運的是,這些問題已被充分認知,且存在諸如MISRA C 和 MISRA C++ 等編碼規范,以有效緩解未定義行為。靜態分析工具如Perforce QAC 和 Klocwork 可用于強制執行這些規范。
原生語言天生具備高性能優勢。C 和 C++ 能夠提供最高級別的執行控制,從而實現最佳的運行時性能和內存效率。但這也帶來了內存訪問錯誤的風險,例如內存釋放后使用。編碼規范可在此方面提供指導:MISRA C 明確禁止使用動態內存;而在 C++ 中,可利用“作用域綁定資源管理”(SBRM)實現內存管理自動化。
Go
Go 語言由 Google 于 2009 年發布,設計上強調并發執行。它允許像C語言一樣手動管理內存(伴隨著相應風險),也支持使用垃圾回收器(GC)進行內存自動管理(但會引入非確定性),因此不適用于實時應用。
Rust
《Rust 參考手冊》描述了 Rust 編程語言,Ferrocene 工具鏈則包含了語言規范。
Rust 提供了一種基于“所有權”機制的新型動態內存管理方案。它規定了程序必須遵守的所有權規則,這些規則用于自動化內存管理,類似于 C++ SBRM。這意味著編寫正確的程序更難,但生成的代碼無需垃圾回收,適用于實時應用。語言規則確保安全的Rust代碼不會出現空指針解引用、緩沖區溢出或數據競爭等錯誤。對于不安全的代碼,則無法提供此類保證。
新成立的“安全關鍵型 Rust 聯盟”(Safety-Critical Rust Consortium)正致力于制定更完善的安全指南。Perforce 已經開發出適用于 Rust 的 MISRA C 子集,并計劃在即將發布的Perforce QAC版本中推出。
總結來說:
- 就語言特性而言,C 語言僅支持過程式編程,而其他語言均支持現代編程范式。
- C 編譯器幾乎支持所有硬件平臺;C++ 編譯器覆蓋其中的絕大多數平臺;Rust 利用 LLVM 技術編譯為原生代碼,支持廣泛的架構;而 Go 僅支持桌面平臺。
- 由于 C++ 基于 C語言,可以直接在 C++ 程序中調用 C 代碼。又因為 C 是上述語言中最古老且最簡單的,而其他語言的編譯器或運行時環境通常是以 C/C++ 實現,因此 C 代碼可以集成到幾乎所有環境中。
- C++ 的集成相對復雜,因其應用二進制接口(ABI)可能變化且存在名稱修飾(name mangling)問題,但對于多數語言已提供解決方案。
- Rust 與 C 語言的兼容性非常好,并支持 C++。Rust 基金會已啟動“C++/Rust 互操作性計劃”,旨在為 C++ 開發成熟且標準化的解決方案。
- Go 不支持直接調用 C/C++ 函數,但可以通過生成封裝器(wrapper)實現交互——這些封裝器依賴于所使用的 Go 編譯器。
平臺語言(Platform Languages)
ava 與 Kotlin
平臺為底層硬件機器提供了抽象層。它包含一個編譯器,用于為虛擬機生成字節碼。Java 和 Kotlin 運行在 Java 平臺上,依賴 Java 虛擬機(JVM);C# 則是 Microsoft .NET 平臺的主要語言,該平臺使用通用語言運行時(CLR)。
程序的執行完全由虛擬機的規范所定義。然而,它們通常配有垃圾回收器,可能會引入非確定性。盡管也存在具備搶占式、確定性垃圾回收器的實時 Java 平臺,程序仍可能出現缺陷和安全問題。因此,我們建議遵循 Java 的 CERT 編碼規范,參考CWE 提供的漏洞列表,以及 OWASP 針對這兩大平臺提供的安全速查指南。
Google 指定 Kotlin 作為 Android 移動平臺的主要編程語言(此前為 Java)。Android 提供了成熟的原生開發套件(NDK),支持 C 和 C++,并于 2021 年新增 Rust 作為選項。
Java 適用于常見的桌面和服務器平臺;.NET 則主要在 Windows 上獲得良好支持。
在集成方面,平臺支持不同的實現方式。JDK提供了常規的集成模式:平臺為本機編程語言提供C語言API(jni.h),使原生代碼能夠與Java虛擬機交互。.NET 框架同樣支持此類集成。但.NET 更進一步:它還為多種語言提供編譯器,其組件可以直接在源代碼層面交互。需要注意的是,不同的語言之間可能存在細微的語義差異。例如 Java 與 Kotlin 雖然都能在 Java虛擬機中直接交互,但 Kotlin 在空值安全方面比Java更強,這類差異必須加以考慮。
最后,.NET 框架還支持與 COM 組件庫的互操作,而 Python.NET 則實現了 Python 與所有 .NET 語言之間的互操作。
解釋型語言(Interpreted Languages)
剩余的兩種語言——Python 和 JavaScript,屬于解釋型語言。解釋器逐行讀取程序并執行指令,這使得它們成為確定性最低、最不適用于實時系統的語言。
Python
Python 是一種流行的腳本語言,運行速度較慢但易于編寫。它常被用作“粘合劑”,用于連接由原生語言編寫的高性能組件。這種集成屬于系統級集成,即通過系統調用來執行可執行的程序。在語言層面,Python 提供了 C語言 API,來編寫運行在Python解釋器中并與之交互的 C 代碼。Python 的流行,部分源于它擁有大量高效的的第三方包(庫),這些包可利用原生代碼處理XML解析等常見任務。
JavaScript
JavaScript 是用于定義網頁行為的語言。目前,某些車載信息娛樂系統(IVI)正是以 Web 應用的形式實現,并使用 JavaScript。ECMA 負責維護 ECMAScript 標準,但實際中存在眾多的語言變體和擴展。由于JavaScript 的版本、框架和運行環境種類繁多,必須充分理解操作環境,才能有效應用 CWE 和 OWASP 提供的指導建議。
在瀏覽器的互操作性方面,WebAssembly 能夠將多種編程語言編譯為可在網頁瀏覽器中高效執行的目標代碼。
對比分析
下表匯總了上文的所述內容,分別從 ISO/SAE 21434 和 ISO 25010 角度評估各語言的適用性。
ISO/SAE 21434 適用性:

ISO 25010 適用性:

如何確定適用于汽車網絡安全的編程語言
語言的適用性取決于項目的安全完整性等級(SIL)。對于安全關鍵型項目,可能需要采用經過認證的工具鏈,這將會大幅縮小可選范圍。
- 在硬件資源有限且實時性要求嚴格的環境中,C語言仍是簡單應用的理想選擇。
- C++ 在復雜的分層框架中更為適用,例如 AUTOSAR 自適應平臺,其 API 以 C++ 進行定義。
- Java 適用于Android等 Java 框架內部,或在采用實時 JVM 的實時環境中。Kotlin 同樣適用于 Android 開發,但其穩定性略遜于 Java,實時支持也較弱;不過,它在車載信息娛樂系統(IVI)中與 JavaScript 的集成表現更佳。
- C# 適用于 .NET 平臺,但該平臺目前并未應用于汽車領域。
- Python 僅適用于少數特定場景,且通常存在更合適的替代方案。
- JavaScript 對于基于 Web 的車載信息娛樂系統(IVI)用戶界面至關重要。
- Rust 提供更強的安全保障,并且隨著新興指導和認證工具鏈的出現,越來越受歡迎。
隨著汽車行業的持續發展,我們的工具和實踐也必須同步升級。編程語言的選擇不僅是一項技術決策,更是一項戰略決策,直接影響系統的安全性、網絡安全性和長期可維護性。
利用 Perforce 靜態分析工具提升汽車網絡安全(支持C、C++、C#、Python、Java、JavaScript 和 Kotlin)
在汽車網絡安全領域,選擇合適的靜態分析工具與選擇合適的編程語言同樣重要。
Perforce靜態分析工具 QAC和Klocwork能夠在開發者編寫代碼的同時,及時檢測網絡安全漏洞,從而持續保障軟件質量。
Perforce QAC 與 Klocwork 還能強制執行 ISO/SAE 21434 等安全標準,并對 MISRA 等安全關鍵型編碼規范中的違規行為進行標記。
Perforce中國授權合作伙伴——龍智
-
AUTOSAR
+關注
關注
10文章
398瀏覽量
23647 -
編程語言
+關注
關注
10文章
1964瀏覽量
39558 -
嵌入式開發
+關注
關注
18文章
1146瀏覽量
50121 -
汽車安全
+關注
關注
4文章
346瀏覽量
35446
發布評論請先 登錄
C++之父:Rust等內存安全語言的安全性并不優于C++
靜態代碼分析工具Helix QAC 2023.3:將100%覆蓋MISRA C++:2023?規則
C語言與Java語言的對比
緩沖區溢出漏洞的原理、成因、類型及最佳防范實踐(借助Perforce 的Klocwork/Hleix QAC等靜態代碼分析工具)
C/C++代碼靜態測試工具Perforce QAC 2025.3的新特性
什么是CVE?如何通過SAST/靜態分析工具Perforce QAC 和 Klocwork應對CVE?
C語言安全編碼指南:MISRA C、CERT C、CWE 與 C Secure 標準對比與Perforce QAC應用詳解
汽車網絡安全開發語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持
評論