?作者 | 徐杰承
審校 | 言征
在剛剛過去的2022年,C++以4.62%的流行增長率,時隔近20年再度榮獲了TIOBE的年度編程語言桂冠。而作為C++語言的締造者,C++之父Bjarne Stroustrup最近卻顯得有些“暴躁”。
去年9月,微軟CTO Mark Russinovich在其社交賬號上發布動態稱:開發人員是時候停止使用C/C++來啟動新項目,并建議在使用non-GC語言的場景中使用Rust。對此,Bjarne也在一次采訪中回懟了Mark的言論。然而就在這次事件平息后不久,一個更具影響力的組織又將矛頭指向了C++。
2022年年底,美國國家安全局(NSA)在其所發布的《Software Memory Safety》報告中指出:C語言和C++語言是不安全的,建議各組織放棄使用C/C++,并鼓勵各組織將編程語言從C和C++等轉向更加安全的替代語言——如C#、Rust、Go、Java或Ruby。對此,NSA網絡安全主任Neal Ziring還在一次采訪中表示,所有程序員都在犯簡單的錯誤,這些錯誤依然非常普遍。
NSA的這篇報告,也再次激發了Bjarne的戰斗欲望。在經歷了數周的準備后,Bjarne于近日發布了一篇名為《Think seriously about“safety”;then do something sensible about it》的論文,正式回應了NSA一系列言論。而雙方的這場隔空對話,也將C++這門擁有近30年歷史的老牌編程語言再次推上了風口浪尖。
1、NSA:少用或禁用C/C++
在《Software Memory Safety》報告中,NSA指出:現代社會嚴重依賴軟件的自動化與隱性信任,如果開發人員所編寫的軟件無法按照預期方式運行,那就意味著有時我們將不得不為惡意目的妥協。目前,惡意利用軟件漏洞的行為經?;趦却鎲栴},其中典型的例子便是內存緩沖區益出。
其舉例稱:微軟在2019年的一次會議上就曾表示,自2006年至2018年,70%的漏洞是由內存安全問題引起的。惡意攻擊者可以利用這些漏洞進行遠程代碼執行或其他非法行為。而谷歌也于近幾年在Chrome瀏覽器中發現了類似的內存安全漏洞。
常用語言如C和C++,雖然提供了很大的自由度和靈活性,但在進行內存管理時,過于依賴于程序員來執行所需的檢查內存引用。因此,簡單的錯誤就可能導致基于內存和可利用性的漏洞。雖然軟件分析工具可以監測到許多內存實例,管理事務和操作環境選項也可以提供一些保護,但內存安全語言的固有保護可以防止或減輕大多數內存管理問題。
技術的缺陷將使作惡者更容易找到存在問題的代碼,使用內存安全語言可以防止程序員引入某些內存相關問題的類型。它們的語言特性將保護程序員無意中引入的內存管理錯誤。因此,美國國家安全局建議各組織選擇“明智的做法”——減少或禁用固有內存保護問題的編程語言,如C/C++,盡可能使用內存安全語言,如C#、Rust、Go、Java或Ruby。
2、Bjarne:你們根本不懂C++
“認真考慮‘安全’,然后采取一些明智的措施”這是Bjarne回應NSA的論文的標題。“太多人談論如神話般的C與C++,然后開始關注C語言的弱點,但這些缺點在C++中完全可以避免,并且C++能更加直接的表達程序員的想法”。在該文章中Bjarne表示,許多C++的使用者停滯不前,NSA完全忽略了C++30年來的進步,并將C與C++混為一談,這令人感到非常遺憾。
“現在,如果我認為這些‘安全’的語言中任何一種在我說關心的使用范圍內優于C++,我不認為C/C++的淡出是一件壞事,但事實并非如此”。Bjarne提到,NSA對“安全”的概念僅限于內存安全,而忽略了一門語言可能被用來違反某種形式的安全保障和十幾種其他方式。
安全的目標應該是類型和資源安全,其中每個對象都根據其類型使用,并且沒有資源泄露。對于C++,這意味著一些運行時規范檢查,消除通過空指針的訪問并避免類型轉換和聯合體的誤用。C++提供了高級工具,如容器、span、range-for循環和變量,它們可以在不損害生產率或效率的同時提供保障。關于NSA提到的所謂安全語言,Bjarne表示,所有語言都容易收到未經靜態驗證的代碼攻擊,每個系統都必須使用硬件,而有效的硬件訪問很少是安全的。
此外,Bjarne還提供了安全使用C++的一些策略:
- 靜態分析,以驗證沒有不安全的代碼被執行
- 編碼規則,以簡化代碼,使工業規模的靜態分析可行
- 庫,使簡化的代碼能簡化編寫,并確保在需要時進行運行時檢查
Bjarne提到,目前世界上有數百萬C++程序員與數十億行C++代碼,該語言被應用在包括航空航天、醫療儀器、人工智能/機器學習、知識圖譜、生物醫學及高能物理等領域,自己對于NSA的言論感到震驚。此外,在文章的末尾,Bjarne還對NSA提出了一個靈魂拷問:據我所知,在發布報告前,沒有一位專家向C++標準委員會進行過資訊,所謂“明智的做法”是什么,建議列出一個明確的清單。
3、誰輸誰贏并沒那么重要
誠然,C++之父與美國國家安全局的這次隔空喊話,讓廣大開發者飽飽的吃了一次大瓜。但在這場針尖對麥芒的battle中,誰輸誰贏其實真的沒有那么重要。C++不安全、C++安全,這兩種說法從辯證的角度來看都是正確的。我們必須承認NSA所提出的,的確有些語言在內存安全保障方面的語言特性是優于C++的;而對于Bjarne的回應,在合理使用工具和保障規范的前提下,C++也確實能夠保證其安全性。
作為一門擁有30年歷史的老牌編程語言,C++依然能夠在今天保持其強大的競爭力,并在編程語言排行榜中位居前列,這無疑不證明著C++功能的強大,以及其在時代考驗下的演進效率。正如Bjarne所說,如今我們擁有著數十億行的C++代碼,基于C++所編寫的軟件也運行在世界的每一個角落。無論在過去還是現在,世界上每天都會產生大量的C++代碼與C++開發者,而這一趨勢也將在未來繼續延續。
每種語言都有自身的優劣勢以及適合的應用場景,世界上并沒有最好的編程語言,只有最適合的編程語言。在此借由Slashdot上一位網友的留言:你可以用C++寫出安全的代碼么?當然可以,用C、ASM甚至任何成熟的編程語言都可以做到。對于任何成熟語言,關鍵問題都不在于是否能做到,而在于如何選擇和更好地使用它們。
參考鏈接:
https://www.infoworld.com/article/3686517/c-plus-plus-creator-bjarne-stroustrup-defends-its-safety.html
https://www.theregister.com/2022/11/11/nsa_urges_orgs_to_use/
https://developers.slashdot.org/story/23/01/21/0526236/rust-safety-is-not-superior-to-c-bjarne-stroustrup-says