編輯 | 言征
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
14日消息,ISO C++委員會主席赫伯·薩特(Herb Sutter)已經(jīng)于本周從微軟離職,此前他已經(jīng)為微軟效力了22年,并選擇加入Citadel Securities擔(dān)任技術(shù)研究員,負(fù)責(zé)技術(shù)戰(zhàn)略和培訓(xùn)。他將繼續(xù)擔(dān)任ISO委員會主席,并稱2024年是C++語言的“關(guān)鍵一年”。
圖片
1.“危險”的C++,內(nèi)存安全性進(jìn)展算不上快
正如薩特所說,2024年是C++的關(guān)鍵之年。
更大一部分還是來自美國政府的壓力。因?yàn)樘嵘齼?nèi)存安全已上升到美國國家安全議題。受到白宮、“五眼”情報機(jī)構(gòu)、聯(lián)邦執(zhí)法機(jī)構(gòu)及美國網(wǎng)絡(luò)安全與基礎(chǔ)設(shè)施局等機(jī)構(gòu)的支持。這一點(diǎn)并非空穴來風(fēng),根據(jù)谷歌的數(shù)據(jù),內(nèi)存安全漏洞約占零日漏洞的 75%,并且在大型代碼庫中的嚴(yán)重漏洞中,約 70% 都源于此類漏洞。
不巧的是,作為老語種,C 和 C++ 經(jīng)常引發(fā)內(nèi)存安全漏洞,因?yàn)樗鼈円蕾囀謩觾?nèi)存管理。手動內(nèi)存管理的優(yōu)勢是通常性能更好,開銷更小,對比 Python 或 Java 這樣的語言則通過垃圾回收來管理內(nèi)存。然而,手動內(nèi)存管理可能會導(dǎo)致緩沖區(qū)溢出、使用釋放后的內(nèi)存等內(nèi)存相關(guān)的錯誤。
今年2月,美國白宮就宣布需要在C和C++上采取一些措施來提升內(nèi)存安全,要么就切換到Rust。
這在 C 和 C++ 社區(qū)中,這引發(fā)了廣泛的討論,因?yàn)檫@兩種語言都不具備內(nèi)存安全性,并且能否實(shí)現(xiàn)內(nèi)存安全都存在很大爭議。
當(dāng)時 C++ 社區(qū)的一個回應(yīng)是提出了 Safe C++ 的提案。
當(dāng)時還是C 和 C++ 委員會成員的前計算機(jī)科學(xué)教授、產(chǎn)品設(shè)計師及圖形專家Robin Rowe 提到了 C++ 之父的決定。
據(jù) Rowe 所言,C++ 語言的創(chuàng)建者 Bjarne Stroustrup 表示他一直在研究“Profiles” [PDF],并希望繼續(xù)下去。“我很尊敬 Bjarne,但我不認(rèn)為 Profiles 是正確的答案,” Rowe 說。“而在 C 社區(qū),答案則更不明確,沒有真正的行動計劃。”
C++ 中一些最大的內(nèi)存安全漏洞是從 C 繼承的。“在3月的會議上,我們討論了如何改進(jìn)異常處理,使 C++ 能有更好的錯誤處理能力。”Rowe 表示,游戲開發(fā)、嵌入式系統(tǒng)及高可用性服務(wù)器的開發(fā)者通常禁用異常,因?yàn)樗鼈兙哂蟹谴_定性并且會帶來性能問題。
那么,C++對于安全性的實(shí)際動作和方向是什么?在之后的CppCon上,薩特表示,安全性并不等同于完美,但將優(yōu)先解決“易達(dá)的安全目標(biāo)”,包括在標(biāo)準(zhǔn)庫中引入更多安全庫、消除與安全相關(guān)的未定義行為、增加編譯時的靜態(tài)安全規(guī)則和動態(tài)安全檢查。
2.C++26:2026年中期完成,自C++11以來影響最大的一次變革
薩特在9月的CppCon會議上表示,“C++ 26標(biāo)準(zhǔn)可能會改變我們開發(fā)軟件的方式”,并將成為自C++11以來對語言影響最大的一次變革。C++ 26標(biāo)準(zhǔn)預(yù)計將在2026年中期完成,目前Clang和GCC等編譯器中的某些特性已開始逐步實(shí)現(xiàn)。
薩特指出了C++ 26的四個關(guān)鍵特性:
·對std::execution(用于異步操作的標(biāo)準(zhǔn)庫)的改進(jìn),以增強(qiáng)并發(fā)性和并行性。
·類型和內(nèi)存安全性增強(qiáng),目標(biāo)是與其他現(xiàn)代、更安全的語言接軌。
·反射和代碼生成,這是“我們轉(zhuǎn)向編譯時編程的一個重大變化”,也是“可能最具影響力的特性”。
·合約特性,用于指定接口并檢查其符合性,包括前置條件、后置條件和狀態(tài)斷言。
薩特在本周的博客中提到,上一個里程碑C++11版本為現(xiàn)代C++引入了auto、lambda表達(dá)式和智能指針等特性,而C++ 26的特點(diǎn)將是“默認(rèn)安全”以及對基于反射的生成型編譯時庫的全面支持。
薩特對該語言充滿熱情:“反射/生成帶來了無限可能!期待完整標(biāo)準(zhǔn)化和編譯器實(shí)現(xiàn)!”有開發(fā)者在演講后評論道。
然而,也有開發(fā)者對語言的日益復(fù)雜表示擔(dān)憂:“整個語言變得如此復(fù)雜。像Cppfront這樣的項(xiàng)目有所幫助,但我們需要一個從C++灰燼中崛起的新語言,而不是Rust。”Cppfront是薩特創(chuàng)建的一個實(shí)驗(yàn)性編譯器,用于驗(yàn)證新概念。
由于需要與遺留代碼保持兼容性,因此添加語言特性總是比刪除它們更容易。
3.實(shí)施C++新特性,微軟有些緩慢
薩特曾在微軟從事Visual C++的工作,這是該公司在Windows和Office等關(guān)鍵應(yīng)用程序中廣泛使用的工具。
考慮到薩特在ISO委員會中的職務(wù),Visual C++在實(shí)施新的C++特性方面相較于Clang和GCC往往較為緩慢,這一點(diǎn)頗為奇怪。
有人認(rèn)為,部分原因是因?yàn)榻陙恚④泝?nèi)部一些知名人士出于安全性和可靠性的考慮,主張轉(zhuǎn)向Rust,Azure首席技術(shù)官M(fèi)ark Russinovich就是其中之一。
4.改進(jìn)C++內(nèi)存安全新思路
當(dāng)然,C++也在努力實(shí)現(xiàn)白宮的內(nèi)存安全的要求,并不是只有轉(zhuǎn)向Rust這一條可走。
本周Rowe 就提出了一種改進(jìn)內(nèi)存管理的TraPC思路,利用編譯器的智能,避免不必要的指針檢查,以提升性能。他希望編譯器能夠自動清零越界的指針,從而避免產(chǎn)生危險的“野指針”。
TrapC 的設(shè)計理念是讓 C 語言保留大致不變的樣式,但指針和錯誤處理以更透明的方式進(jìn)行。
不過,由于現(xiàn)有的 C++ 標(biāo)準(zhǔn)委員會流程緩慢,Rowe 認(rèn)為走傳統(tǒng)提案路線過于耗時,因此選擇直接分叉 C 語言。
參考鏈接:https://devclass.com/2024/11/12/iso-c-chair-herb-sutter-leaves-microsoft-declares-forthcoming-c-26-most-impactful-release-since-c11/